【问题标题】:Capybara with rspec doesn't always find button (test faills)带有 rspec 的 Capybara 并不总能找到按钮(测试失败)
【发布时间】:2021-04-19 07:44:32
【问题描述】:

我正在与 rspec 和一键作战。在我的 html.erb 我有

<button name="Collapse bank accounts" class="btn btn-sm btn-primary rounded-circle" type="button" data-bs-toggle="collapse" data-bs-target="#of-bank-ucties" aria-expanded="false" aria-controls="of-bank-ucties">
     <i class="fa fa-plus"></i>
</button>

从 fontawesome 生成带有 svg 的按钮。

在我的 rspec 我有

button_to_expand_bu = find_button('Collapse bank accounts')
button_to_expand_bu.click

expect(page).to have_selector(:css, '[data-bs-toggle="collapse"][data-bs-target="#of-bank-ucties"][aria-expanded="true"]')

问题是测试在 50% 的运行中都失败了,我不知道为什么它如此不可靠。

我尝试使用 find(path)、click_button(button)、find().click 找到按钮,但每个按钮都有相同的结果。有时会通过,有时不会...

这里到底发生了什么?

我正在使用最新的 gems 并且按钮是可见的,我在屏幕截图中看到了他,它不可能是不可见的。当测试在铬中进行时,我看到测试停止,当它应该单击按钮时,等待 1 秒并显示它失败......

【问题讨论】:

  • 您得到的确切错误是什么,错误来自测试的哪一行?
  • 无法找到具有给定css的元素,错误行是expect(page)...

标签: rspec capybara ruby-on-rails-6


【解决方案1】:

由于错误来自您的 expect(page)... 行,这意味着 Capybara 认为它已单击按钮(否则错误将来自 find_buttonclick 行。这意味着只有几个原因你的问题

  1. 您检查的 CSS 不正确 情况可能并非如此,因为您声称它在 50% 的时间内都有效

  2. 点击正在发生,但您没有给它足够的时间来更改 CSS 通过增加have_selector 将等待的最大时间来测试 - expect(page).to have_selector(:css, '[data-bs-toggle="collapse"][data-bs-target="#of-bank-ucties"][aria-expanded="true"]', wait: 10)

  3. 点击正在发生,但页面尚未准备好点击。通过在click 调用之前添加sleep 3 来测试它 - 如果这样可以解决问题,那么您需要在单击指示页面准备就绪的按钮之前找到一些期望的东西

  4. 您正在为页面上的按钮设置动画,并且在 Capybara 尝试单击它时按钮正在移动。以与 #3 相同的方式进行测试(睡觉以等待动画完成),如果它解决了问题,您需要设置一个指示动画已完成的预期,或者在测试时禁用动画。

注意:click_button 被定义为 find_button(...).click - https://github.com/teamcapybara/capybara/blob/f7ab0b5cd5da86185816c2d5c30d58145fe654ed/lib/capybara/node/actions.rb#L57 - 因此,将其作为两个单独的调用执行此操作的优势为零,除非您稍后需要在代码中访问按钮元素 (button_to_expand_bu)。

【讨论】:

    猜你喜欢
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多