我可以检测元素(按钮)是否可以点击"在我的rspecs?

时间:2017-12-29 18:54:47

标签: ruby rspec click capybara

上下文:在我的rspec中(使用Ruby和Capybara)

  1. 点击链接在我的应用中测试操作:向我的应用添加分支。
  2. 打开一个模态窗口,我选择分支,然后点击"提交"按钮将分支添加到我的应用程序。点击"提交"模态窗口关闭。
  3. 点击"保存"继续rspecs。在主屏幕中,保存应用程序的状态(并有效地保存添加分支)。
  4. 问题:rspec失败了,因为(貌似)它正试图点击" Save"用于选择分支的模态窗口仍然存在时,主屏幕上的按钮。测试没有抱怨它无法找到" Save"按钮组件,但无法单击它。

    日志中的错误是:

    [...]Save</button> is not clickable at point (692, 23). Other element would receive the click[...]

    gotcha :此rspec在某些环境中正确传递,例如在对我的本地服务器运行时,但在我们的自动化服务器执行时失败。因此,此测试已被标记为&#34; flaky&#34;。

    潜在解决方案:到目前为止我们尝试过的事情:

    • 围绕我们的&#34;点击配置&#34;,确保我们处于&#34;就绪状态&#34;并且模态窗口消失了。我们失败了,因为我们一直遇到同样的错误。

    • 实施&#34;等待&#34;。当模态窗口似乎存在时,我们添加了一个循环来休眠一下

      XYZ.add_new_branch_name(@branch_name) while Utilities.element_visible?(:xpath, myElement) sleep(0.5) end XYZ.save

    while条件检查&#34;提交&#34;模态窗口的按钮存在。 element_visible函数使用

    find(method,element).visible?
    

    但是我不确定find是否应该考虑按钮可能存在并且可见但不可点击

    由于这仍然失败,尽管我们努力确保在我们尝试点击&#34; save&#34;之前已经消除了模态。按钮,我想要问:

    是否有正确的方法来检测模态窗口后面的元素是否可点击或不使用rspecs?

2 个答案:

答案 0 :(得分:1)

find只关注&#34;可见性&#34;而不是&#34;可点击性&#34; (并且不同的驾驶员可能对&#34;可见性和#34;略有不同的解释。您看到的片状的原因很可能是机器运行测试的速度,这会影响模态动画的时间。解决此问题的最佳方法是在测试模式下禁用动画(如何执行此操作取决于您为动画准确使用的库和/或CSS)。另一种方法是做你正在做的事情 - 在点击“保存”之前检查模态是否消失了。按钮,但是你应该只使用Capybara提供的方法(包括等待/重试行为),而不是为此编写自己的循环。

 expect(page).not_to have_css('css selector of the modal') # RSpec version
 assert_no_css('css selector of the modal') # minitest version

从错误中查看鼠标位置后,您可能遇到的另一个潜在问题是屏幕大小和滚动。如果页面需要滚动才能进入“保存”状态。按钮和(692,23)会将按钮放在固定标题后面(您应该能够通过在按钮点击尝试之前截取屏幕截图来验证)然后可能无法使用您使用的任何驱动程序单击按钮。在这种情况下,您需要使用execute_script将页面滚动到其他位置,以便页面上不显示按钮和/或增加浏览器&#34;尺寸因此在测试中不需要滚动。

答案 1 :(得分:0)

我遇到了类似的问题,并通过编写自己的click_on_with_wait辅助函数来解决了这个问题:

def click_on_with_wait(text, wait_time: Capybara.default_max_wait_time)
  success = false

  (wait_time * 10).round.times do
    click_on text
    success = true
    break
  rescue Selenium::WebDriver::Error::WebDriverError
    sleep(0.1)
  end

  # Try clicking one last time, so that the error will get raised if it still doesn't work
  click_on text unless success
end

这将尝试单击该元素。如果仍然被模式隐藏,该函数将等待100毫秒,然后重试,直到达到给定的wait_time

使用Rails,我将其放在system_spec_helpers.rb中,以便可以将click_on 'Submit Form'替换为click_on_with_wait 'Submit Form'