Capybara中CSS元素的等待功能

时间:2017-09-22 07:55:43

标签: selenium selenium-webdriver capybara selenium-chromedriver capybara-webkit

Capybara有等待和不等待的功能。我试图尽可能地使用第一个。

有没有办法使用find(或其衍生产品之一)来查找异步显示的CSS元素? 不幸的是,函数page.has_css?是一个非等待函数。

1 个答案:

答案 0 :(得分:4)

您声称page.has_css?是非等待功能的说法不正确。 page.has_css?将等待Capybara.default_max_wait_time秒,以便元素显示在页面上,并根据该时间内该元素是否在页面上返回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在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秒内未找到该元素,则会引发异常。

注意:基本上,唯一的非等待方法是allfirst,如果您传入任何计数选项(:count,{ {1}},:minimum:maximum),虽然从它们返回的元素仍然是不可重载的,因此如果用于作用域等,可能会产生进一步的行为效果。甚至像{{1 }},:between等将等待,因为它们被实现为click_link等等