You can chain multiple
Capybara matchers
Show archive.org snapshot
on the page
or any element:
expect(page)
.to have_content('Example Course')
.and have_css('.course.active')
.and have_button('Start')
When you chain multiple matchers using and
,
Capybara will retry the entire chain
Show archive.org snapshot
if any of the matchers fail.
This helps when browser state changes between expectations, e.g. by async JavaScript that mutates the DOM tree while you're making multiple observations.
Custom matchers must be retryable
For Capybara to be able to retry chain, any custom matchers must be able to re-run their match
block.
Here is a ❌ bad example of a matcher that memoizes its observation (in #actual_state
) and cannot be retried:
RSpec::Matchers.define :have_state do |expected_state|
match do |element|
actual_state(element) == expected_state
end
failure_message do
"expected state to be #{expected_state}, but was #{actual_state(element)}"
end
def actual_state(element)
@actual_state ||= element['data-state']
end
end
Posted by Henning Koch to makandra dev (2024-03-07 07:50)