Capybara 中 CSS 元素的等待函数

Waiting function for CSS element in Capybara

水豚有等待和非等待功能。我正在尝试尽可能多地使用第一个。

有没有一种方法可以使用 find(或其衍生物之一)来查找异步出现的 CSS 元素? 不幸的是,函数 page.has_css? 是一个非等待函数。

您声称 page.has_css? 是非等待函数是不正确的。 page.has_css? 将最多等待 Capybara.default_max_wait_time 秒让元素出现在页面上,return truefalse 取决于元素是否在页面上那段时间内的页面。因此,给定 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 在页面上可见,它就会打印 "on page"。如果匹配的 div 在 5 秒内不可见,它将打印 "not on page"。如果您希望它等待特定呼叫的时间更长,您可以通过传递 :wait 选项

来覆盖 default_max_wait_time
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

它将像以前一样等待元素出现,但如果元素没有出现

,则引发异常而不是 returning false

如果您需要实际元素,您可以使用 find,这也会等待。所以

el = page.find(:css, 'div#my_div') # :css is the default and can usually be omitted

将等待元素出现并 return 找到元素。如果在 default_max_wait_time 秒内未找到该元素,它将引发异常。

注意:基本上,唯一的非等待方法是 allfirst 如果您传入任何计数选项,甚至可以让这些方法等待(:count , :minimum, :maximum, :between), 尽管从它们 return 中提取的元素仍然是不可重新加载的,因此如果用于范围界定等,可能会产生进一步的行为影响. 即使像 click_linkclick_button 等方法也会等待,因为它们被实现为 find(...).click、等