【问题标题】:Rails Tests with RSpec and Capybara can't find links in application.html.erb使用 RSpec 和 Capybara 进行 Rails 测试在 application.html.erb 中找不到链接
【发布时间】:2018-02-10 19:03:50
【问题描述】:

我正在使用 RSpec 和 Capybara 为我的 Rails 应用程序编写功能测试,但我的测试失败并显示错误消息:

Failure/Error: click_link "Google"

     Capybara::ElementNotFound:
       Unable to find visible link "Google"

我的规范写成:

 it "lists logged in user's profile data" do
      visit '/'
      mock_auth_hash
      click_link "Google"
      click_link "User"
      expect(page).to have_content('mockuser')
    end 

我的 Google 登录 link_to 在我的 application.html.erb 布局中:

<a class="nav-item nav-link"><%= link_to 'Google', '/auth/google' %></a>

当我使用相同的 link_to 并将其放入我的根页面时,测试顺利通过。 Capybara 很可能没有在我的 application.html.erb 布局中获取 HTML。我不确定如何解决这个问题,而且 Capybara 的文档没有说明任何解决方案。

感谢您提供的任何帮助。

【问题讨论】:

  • 在 dom 中是否可以看到 link_to?如果不是,例如有一种将其可见性或显示值设置为隐藏的样式,然后水豚将找不到它。可以在您的水豚选择器中使用visible: false...但这没有多大意义,因为用户无法单击他们看不到的链接。我会尝试使用js: true 进行一些调试

标签: ruby-on-rails rspec capybara


【解决方案1】:

Capybara 不太可能只是忽略页面的某些部分,更有可能是您的应用在渲染页面时实际上并未正确渲染该布局(可能是因为您在链接中渲染了一个链接 - 这是非法 html https://www.w3.org/TR/html52/textlevel-semantics.html#the-a-element - 出于某种原因??)。在 visit 之后休眠几秒钟,然后如果您使用的驱动程序支持屏幕截图 - 拍摄一个,如果不使用 save_and_open_page 并检查 HTML 以查看页面上的实际内容。

visit('/')
sleep 3
save_and_open_screenshot # If the driver supports screenshots
# save_and_open_page # To look at the actual HTML

您可能会发现该页面上确实没有该链接。

【讨论】:

  • 嗨,Thomas,你说得对,我在另一个链接类中有一个链接。有趣的是 Rails(或浏览器)足够聪明,可以使该链接正常工作,但显然这导致 Capybara 失败。
  • @maxking Capybaras default rack_test 驱动程序对有效 HTML 的要求比大多数浏览器要严格得多(它们会忽略并尝试解释,有时会以不同的方式解释尽可能多的损坏的 HTML)。如果此答案解决了您的问题,请不要忘记接受它(复选标记),以便您的问题被标记为已回答。
  • 在 visit() 和 find() 之间添加延迟解决了我遇到的一些随机元素的问题,我认为这些随机元素总是存在,只是导致一些测试在后台随机失败,可能是由于较低进程优先级什么的。
  • @NickM 而不是添加延迟 - 将 wait: 10(或更大的值,如果需要)作为选项传递给 find 调用,因此它将等待比正常时间更长的时间以使元素可用
  • 谢谢。我已根据规格将其设置为 1-2 秒,但我想有时 SPA 并没有那么快地完成所有业务……或者其他东西阻止了它,不确定。现在它可以工作了,我不介意在该测试上多花 10 秒,而不是深入研究各种代码和设置 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多