【问题标题】:Handling Element is not clickable at point (x, y). Other element would receive the click: With Capybara, ruby, Webdriver处理元素在点 (x, y) 处不可点击。其他元素会收到点击:使用 Capybara、ruby、Webdriver
【发布时间】:2018-09-30 02:32:07
【问题描述】:

我正在编写一个 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 这没问题并且不会出错,所以我可以继续我的测试用例(黄瓜)中的下一步。我意识到循环类型的选择也可能不正确,因此也可以随意提出更改建议。

【问题讨论】:

  • 不,您的假设是错误的,当按钮被隐藏时不会发生此错误,而是会在按钮被其他元素覆盖时发生。
  • 谢谢 - 应该更清楚。我的意思是隐藏在隐藏/不可见
  • 你的不可见性对 selenium 来说是不可见的,如果元素出现在页面的底部,它对你来说是不可见的,但它对 selenium 不是不可见的,当元素存在时,selenium 认为某些东西是不可见的,但它仍然是隐藏的,但无论如何你的错误是不可见的!如果它是不可见的,那么它会抛出错误element is invisible
  • 感谢您提供详细信息
  • 如果你仍然想点击,你可以在你的 selenium 代码中注入 JavaScript,它不会做任何检查,但你会失去对隐式等待的控制。

标签: ruby rspec cucumber capybara selenium-chromedriver


【解决方案1】:

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

其次,whilebreak 在您的问题中的循环没有多大意义,因为它们检查的是同一件事。此外,假设“加载更多”按钮正在通过 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? 等),但一般逻辑应该是正确的

【讨论】:

  • 感谢您 - 循环非常有意义。关于第一部分的更多研究,开发团队似乎正在使用一些引导程序 (getbootstrap.com/docs/4.0/utilities/display) 进行响应式设计。他们通过添加 .d-none 来“隐藏”元素
  • 文章列表用完时。不确定这是否会改变您答案的第一部分,但我认为值得一提,即使只是为了清楚起见。
  • @SuleyMahmoud 假设引导 CSS 已正确加载 .d-nonedisplay:none 分配给元素,但如果这是您的问题,您应该收到 unable to find element(或等效)错误,而不是 @ 987654331@。这一切都假定无论您的 has_load_more? 方法做什么,它都会忽略隐藏元素,而 click 方法是标准的 Capybara click。基本上,您有一个与“按钮”重叠的元素(我假设它实际上是错误中的 div),您需要找出原因(查看屏幕截图)
猜你喜欢
  • 2017-12-08
  • 2017-11-27
相关资源
最近更新 更多