【问题标题】:With Capybara, how do you get assertions on transient elements to work?使用 Capybara,您如何使瞬态元素的断言起作用?
【发布时间】:2019-06-11 19:18:57
【问题描述】:

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

我的问题是测试运行太快了!在遇到失败之前,我可以在三个断言之间下车……但我有四个断言要进行!

是否有任何方法可以让 Capybara 在特定时刻针对页面运行它的断言,或者可能有一些解决方法来让加载的内容显示足够长的时间以便以可靠的方式正确测试它?

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

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

【问题讨论】:

  • 这不是一个真正的答案,但考虑不测试它们,至少不在系统级别。我的经验是,这些类型的断言(瞬态元素、次要 UI 行为)可以解决 90% 的开发难题和间歇性故障,而只能消除 10% 的用户工作流实际风险。如果可能,将这些检查下推到客户端单元/集成测试(我知道这并不容易)。如果唯一的选择是做一个脆弱/复杂的系统测试,可能会变成一个球和链,我真的认为有时只接受覆盖范围的差距是有效的。

标签: ruby-on-rails capybara minitest


【解决方案1】:

Capybara 对实时页面起作用,因此(在当前版本中)无法将页面冻结在当前状态(实际上不是 100% 正确,因为您可以使用 document = Capybara.string(page.html) 捕获页面的源并然后对文档使用finders/matchers/etc,但你会丢失CSS、JS等)。由于assert_text/refute_text 可以接受正则表达式,因此您可以将所有反驳合并为一个

refute_text(/Edit|Submit|Cancel/)

这可能会让你了解时间(尽管任何依赖时间的东西都会在某个时候因为正在运行的硬件发生变化等而中断)

从另一个方向来看问题,您的问题可以描述为您的 AJAX 请求返回太快。您可以设置数据以使请求花费更长的时间,您可以使用代理来延迟您的请求(puffing_billy 等),或者如果在 Chrome 中使用 selenium,您可以查看 selenium 驱动程序上可用的 network_condtions= 方法

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

作为减慢请求速度的一种方式。这会将测试限制为仅在您可能接受也可能不接受的 Chrome 上运行。

如果您使用 Chrome 并愿意尝试测试版代码,另一个选择是使用 Capybara 的 page_freeze 分支,它添加了

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

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2022-06-19
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多