单击后短暂显示一个元素,然后在服务器返回响应后消失。这是当前代码:
#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')
有时该元素会消失得如此之快,以至于第一个期望无法识别其存在并且测试失败。但是,如果删除了第一个期望,则第二个期望可能会在元素第一次出现之前执行,并且我们不会成功测试不存在性。
是否有更好的方法来测试水豚中短暂出现的元素?
编辑:测试该元素是否消失就足够了,但是考虑到水豚不应该使用睡眠。
答案 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并继续。
如果实际上需要检测元素的出现和消失,那么任何解决方案都取决于确切触发元素显示和删除的因素。假设它是一个请求发生的指示符,该指示符在请求开始时出现,然后在请求完成时被删除,您需要查看放慢请求的速度,以便该元素保持可见的时间更长。可以实现的两种方法是
page.driver.browser.set_network_conditions
,尽管这是特定于驱动程序的解决方案。