与水豚一起检查临时元素

时间:2019-07-12 09:49:21

标签: ruby rspec capybara

单击后短暂显示一个元素,然后在服务器返回响应后消失。这是当前代码:

#send request to server
something.click
#make sure temporary element appears
expect(page).to have_css('#foo')
#make sure temporary element disappears after server returns response
expect(page).to have_no_css('#foo')

有时该元素会消失得如此之快,以至于第一个期望无法识别其存在并且测试失败。但是,如果删除了第一个期望,则第二个期望可能会在元素第一次出现之前执行,并且我们不会成功测试不存在性。

是否有更好的方法来测试水豚中短暂出现的元素?

编辑:测试该元素是否消失就足够了,但是考虑到水豚不应该使用睡眠。

1 个答案:

答案 0 :(得分:1)

浏览器测试的异步性质意味着,不一定总是可以通过默认设置可靠地定位临时元素。既然您声明可以确定元素已消失,并且可以确定时间表,则可以可靠地保证元素会出现在您可以执行的操作中,例如

#send request to server
something.click
#wait for temporary element to appear - don't error if it doesn't
page.has_css?('#foo', wait: 2)
#make sure temporary element disappears after server returns response
expect(page).to have_no_css('#foo')

最多等待2秒钟(根据需要进行调整),该元素才会显示。如果确实出现,它将在元素可见后立即继续;如果不出现,它将在2秒后返回false并继续。

如果实际上需要检测元素的出现和消失,那么任何解决方案都取决于确切触发元素显示和删除的因素。假设它是一个请求发生的指示符,该指示符在请求开始时出现,然后在请求完成时被删除,您需要查看放慢请求的速度,以便该元素保持可见的时间更长。可以实现的两种方法是

  1. 像喘气的可编程代理
  2. 如果将Selenium驱动程序与Chrome一起使用,则可以使用page.driver.browser.set_network_conditions,尽管这是特定于驱动程序的解决方案。