Capybara的功能规范与Turbo Drive失败

4

我正在尝试在我的Rails 6.1应用程序中的一些页面上引入Turbo Drive。

在将一些旧的JQuery插件初始化从$(document).ready()调用移动到document.addEventListener('turbo:load', ..)调用后,我得到了预期的结果。

然而,当我运行我的Capybara功能规范时,我可以从失败的规范截图中看到,像JQuery插件没有像它们应该那样被初始化。一个典型的失败测试示例:

scenario 'element is visible', :js do
  visit(my_page_path)
  expect(page.find(#some-jquery-plugin-created-element).text).to \
         eq 'some expected text from the plugin element'
end

有人能帮我理解为什么这在功能规格中不起作用吗?在我看来,turbo:load事件根本没有被触发。


我尝试过的方法

检查浏览器日志

我在驱动程序中启用了日志功能:

Selenium::WebDriver::Remote::Capabilities.chrome( "goog:loggingPrefs": { browser: 'ALL' } ).

但在失败的expect调用之前立即调用 page.driver.browser.manage.logs.get(:browser) ,只返回一个空数组。

也许我的做法有问题?

确保Capybara在页面加载完成之前不会超时

Capybara.default_max_wait_time = 10

1个回答

3

通过编写您的期望,例如

expect(page.find(#some-jquery-plugin-created-element).text).to \
         eq 'some expected text from the plugin element'

你正在破坏Capybara的重试功能,这将导致动态页面中出现大量失败的测试。在处理Capybara相关对象时,您应该“永远”不使用基本的RSpec匹配器(如eq等)。
在您的情况下,find调用正在等待匹配的元素存在,然后获取其文本并检查它。这将失败,因为当元素首次添加到页面时,它可能尚未具有完整的文本内容。相反,您应该使用Capybara提供的匹配器,这将使用Capybara的等待行为来匹配事物。
expect(page.find(#some-jquery-plugin-created-element)).to have_text('some expected text from the plugin element')

在我的情况下,这并没有解决原始问题,但至少我很感激你提醒了我! - rogerkk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接