使用Capybara,如何获得对瞬态元素起作用的断言?

时间:2019-06-11 19:18:57

标签: ruby-on-rails capybara minitest

在尝试返回ajax请求的结果之前,我正在测试加载图标是否正确显示,其他元素是否正确显示。

我的问题是测试运行太快!在遇到失败之前,我可以先进行三个断言之间的交流...但是我要提出四个断言!

是否有任何方法可以让Capybara在特定时刻针对页面运行断言,或者是否有某种变通办法可以使加载的东西显示足够长的时间,从而以可靠的方式对其进行正确的测试?

我当前的测试看起来像这样:

click_on('Submit')
assert_text('...')
refute_text('Edit')
refute_text('Submit')
refute_text('Cancel')

1 个答案:

答案 0 :(得分:2)

Capybara对实时页面有效,因此(在当前发行版中)无法将页面冻结为当前状态(实际上不是100%正确,因为您可以使用document = Capybara.string(page.html)来捕获页面的来源)页面,然后对文档使用finders / matchers / etc,但是您丢失了CSS,JS等)。由于assert_text / refute_text可以接受Regexp,因此您可以将所有引用合并为一个

refute_text(/Edit|Submit|Cancel/)

这可能会让您了解时间安排(尽管与时间有关的任何事情都会在硬件运行发生变化的某个时候中断)

从另一个方向来看问题,您的问题可能被描述为您的AJAX请求返回得太快。您可以设置数据以延长请求的时间,可以使用代理来延迟请求(puffing_billy等),或者如果将硒与Chrome搭配使用,则可以查看硒驱动程序上可用的network_condtions=方法

page.driver.browser.network_conditions=(...)

,以减慢您的请求的速度。这样会将测试限制为只能在您可能会接受或可能无法接受的Chrome上运行。

如果您使用的是Chrome并愿意尝试Beta版代码,则另一种选择是使用Capybara的page_freeze分支添加

page.driver.freeze_page # Pause page activities
page.driver.thaw_page # Resume page activities