上下文:在我的rspec中(使用Ruby和Capybara)
问题: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?
答案 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'
。