【问题标题】:Can I detect if an element (button) is "clickable" in my rspecs?我可以在我的 rspecs 中检测元素(按钮)是否“可点击”吗?
【发布时间】:2019-05-09 16:21:13
【问题描述】:

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

  1. 我单击一个链接来测试我的应用中的一个操作:向我的应用添加一个分支。
  2. 会打开一个模式窗口,我在其中选择分支,然后单击“提交”按钮将分支添加到我的应用程序中。单击“提交”后,模式窗口关闭。
  3. 通过单击主屏幕中的“保存”继续 rspecs,以保存应用程序的状态(并有效地保存添加分支)。

问题:rspec 失败,因为(似乎)它试图单击主屏幕上的“保存”按钮,而用于选择分支的模式窗口仍然存在。测试并没有抱怨找不到“保存”按钮组件,而是无法点击。

日志中的错误是:

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

A gotcha:此 rspec 在某些环境中正确传递,例如在我的本地服务器上运行时,但在我们的自动化服务器执行时失败。因此,该测试已被标记为“不稳定”。

可能的解决方案:到目前为止我们已经尝试过的方法:

  • 玩转我们的“点击配置”,确保我们处于“就绪状态”并且模式窗口已消失。我们失败了,因为我们一直遇到同样的错误。

  • 实现“等待”。当模态窗口似乎存在时,我们添加了一个循环休眠

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

while 条件检查模态窗口的“提交”按钮是否存在。 element_visible 函数使用

find(method,element).visible?

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

由于这仍然失败,尽管我们在尝试单击“保存”按钮之前尽了所有努力确保模式消失,我想问一下:

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

【问题讨论】:

    标签: ruby rspec click capybara


    【解决方案1】:

    find 只关心“可见性”,而不关心“可点击性”(不同的驱动程序对“可见性”的解释可能略有不同)。您看到的片状现象的原因很可能是机器运行测试的速度,这会影响模态动画的时间。解决此问题的最佳方法是在测试模式下禁用动画(您如何执行此操作取决于您为动画使用的库和/或 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 将页面滚动到其他位置,这样按钮就不会被页面覆盖和/或增加“浏览器”大小,因此在测试中不需要滚动。

    【讨论】:

      【解决方案2】:

      我遇到了类似的问题,并通过编写自己的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
      

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

      使用 Rails,我将它放在 system_spec_helpers.rb 中,这样我就可以简单地将 click_on 'Submit Form' 替换为 click_on_with_wait 'Submit Form'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-12
        • 2014-08-13
        • 1970-01-01
        • 2021-11-03
        • 2016-09-08
        • 2018-11-05
        相关资源
        最近更新 更多