Capybara有等待和不等待的功能。我试图尽可能地使用第一个。
有没有办法使用find
(或其衍生产品之一)来查找异步显示的CSS元素?
不幸的是,函数page.has_css?
是一个非等待函数。
答案 0 :(得分:4)
您声称page.has_css?
是非等待功能的说法不正确。 page.has_css?
将等待Capybara.default_max_wait_time
秒,以便元素显示在页面上,并根据该时间内该元素是否在页面上返回true
或false
。因此,给定Capybara.default_max_wait_time = 5
if page.has_css?("div#my_div")
puts "on page"
else
puts "not on page"
end
将等待最多5秒钟。一旦id为" my_div"它将在页面上显示"在页面"上显示。如果匹配的div在5秒内不可见,它将打印"不在页面"。如果您希望等待更长时间进行特定通话,可以通过传递default_max_wait_time
选项
:wait
if page.has_css?("div#my_div", wait: 10) # will wait up to 10 seconds
...
如果您想要确保元素存在而不想要布尔响应,则可以执行任何
page.assert_selector(:css, 'div#my_div') # :css is the default so can usually be omitted
page.assert_css('div#my_div') # minitest
expect(page).to have_css('div#my_div') # RSpec
将等待元素像以前一样出现,但是如果元素没有出现则引发异常而不是返回false
如果您需要实际元素,可以使用find
,它也会等待。所以
el = page.find(:css, 'div#my_div') # :css is the default and can usually be omitted
将等待元素出现并在找到时返回元素。如果在default_max_wait_time
秒内未找到该元素,则会引发异常。
注意:基本上,唯一的非等待方法是all
和first
,如果您传入任何计数选项(:count
,{ {1}},:minimum
,:maximum
),虽然从它们返回的元素仍然是不可重载的,因此如果用于作用域等,可能会产生进一步的行为效果。甚至像{{1 }},:between
等将等待,因为它们被实现为click_link
等等