处理元素在点(x,y)处不可点击。其他元素将获得点击:使用Capybara,ruby,Webdriver

时间:2018-04-19 14:27:16

标签: ruby rspec cucumber capybara selenium-chromedriver

我正在编写一个UI测试,该测试会转到文章列表并选择load_more按钮,直到它不再可用(因为所有文章都已加载)。问题是此时隐藏了按钮而不是删除按钮并返回此错误

Selenium::WebDriver::Error::UnknownError: unknown error: Element <div 
class="">...</div> is not clickable at point (x, y). Other element 
would receive the click: <div class="" id="" data-module-name="">... 
</div>

(Session info: chrome=65.0.3325.181)
(Driver info: chromedriver=2.36.540469 
ruby-2.5.1/gems/selenium-webdriver 
3.11.0/lib/selenium/webdriver/remote/response.rb:69:in `assert_ok'

我尝试了一些循环类型但是为此,如果我们假设我使用

while world.page.has_load_more?
  world.page.load_more.click
break if world.page.has_load_more? == false
end

问题是如何告诉Selenium这是好的而不是错误,所以我可以继续我的测试用例(黄瓜)的下一步。我意识到循环类型的选择可能也是不正确的,所以也可以随意建议更改。

1 个答案:

答案 0 :(得分:1)

首先,正如Rajagopalan指出的那样,你所得到的错误并不是你的元素不可见(如CSS隐藏),而是它与另一个元素重叠。你可以调用save_and_open_screenshot来查看哪个元素与按钮重叠(可能是一个固定的页脚等?)。确保您已将窗口大小设置得足够大,这样您就不会无意中重叠元素并确保您正在运行最新版本的Capybara,因为它试图通过滚动来处理selenium中的重叠元素如果可能的话,他们会进入视野。

其次,问题中的循环对whilebreak都没有多大意义,因为它们会检查相同的内容。此外,假设&#34;加载更多&#34;按钮正在加载并通过AJAX附加到页面,您可能需要等待新元素加载,然后再检查按钮是否存在(click不等待操作完成,因为它不知道可以执行哪些操作/会被触发)。那将成为类似

的结构
 while page.has_button?('Load More')
   # Get the current number of visible articles
   article_count = page.all('div.article').count # Use whatever selector would match an article in the list
   # click the button
   page.click_button('Load More')
   # ensure more articles have loaded
   expect(page).to have_css('div.article', minimum: article_count + 1)
end

注意:您可能希望更改它以使用您正在使用的任何页面对象方法(has_load_more?等),但一般逻辑应该是正确的