用 Capybara 检查临时元素
Check for temporary element with Capybara
元素在点击后短暂出现,然后在服务器 returns 响应后消失。这是当前代码:
#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')
有时候元素会消失的太快,以至于第一个expect无法识别它的存在而测试失败。但是,如果第一个 expect 被删除,第二个 expect 可能会在元素首次出现之前执行,并且我们无法成功测试不存在。
有没有更好的方法来测试 Capybara 中短暂出现的元素?
编辑:测试元素是否消失就足够了,但考虑到 sleep 不应该与 Capybara 一起使用。
浏览器测试的异步特性意味着使用默认设置并不总是能够可靠地定位临时元素。既然你说只要确保元素已经消失就可以了,并且你有一个时间范围,你可以可靠地保证元素会出现在你可以做类似
的事情
#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 秒后 return false 并继续。
如果真的需要检测元素的出现和消失,那么任何解决方案都取决于究竟是什么触发了元素的显示和移除。假设它是一个请求发生的指示器,它在请求开始时出现,然后在请求完成时被删除,您需要考虑减慢请求速度,以便元素保持可见的时间更长。可以实现的两种方法是
- 像puffing-billy
这样的可编程代理
- 如果将 Selenium 驱动程序与 Chrome 一起使用,您可以使用
page.driver.browser.set_network_conditions
尽管这将是特定于驱动程序的解决方案。
元素在点击后短暂出现,然后在服务器 returns 响应后消失。这是当前代码:
#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')
有时候元素会消失的太快,以至于第一个expect无法识别它的存在而测试失败。但是,如果第一个 expect 被删除,第二个 expect 可能会在元素首次出现之前执行,并且我们无法成功测试不存在。
有没有更好的方法来测试 Capybara 中短暂出现的元素?
编辑:测试元素是否消失就足够了,但考虑到 sleep 不应该与 Capybara 一起使用。
浏览器测试的异步特性意味着使用默认设置并不总是能够可靠地定位临时元素。既然你说只要确保元素已经消失就可以了,并且你有一个时间范围,你可以可靠地保证元素会出现在你可以做类似
的事情#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 秒后 return false 并继续。
如果真的需要检测元素的出现和消失,那么任何解决方案都取决于究竟是什么触发了元素的显示和移除。假设它是一个请求发生的指示器,它在请求开始时出现,然后在请求完成时被删除,您需要考虑减慢请求速度,以便元素保持可见的时间更长。可以实现的两种方法是
- 像puffing-billy 这样的可编程代理
- 如果将 Selenium 驱动程序与 Chrome 一起使用,您可以使用
page.driver.browser.set_network_conditions
尽管这将是特定于驱动程序的解决方案。