即使元素可见,Watir-webdriver也会抛出'not clickable'错误

时间:2016-04-19 01:32:49

标签: ruby watir clickable

我正在尝试使用最新的 Watir-Webdriver 0.9.1 Selenium-Webdriver 2.53.0 Chrome扩展2.21 <来自动化Ruby测试EM>。但是,我测试的网站顶部有静态标题,底部有静态页脚。因此,由于Watir在单击之前将元素自动滚动到视图中,因此元素隐藏在静态页眉或静态页脚下。我不想将desired_capabitlites (ElementScrollBehavior)设置为10,因为我正在测试的网站可以兼具 - 静态页眉或静态页脚或两者。

因此问题是:
1)为什么即使元素可见并存在,Watir也会抛出异常Element not clickable?请参阅ruby代码(我已选择一个随机的公司网站作为示例)和结果如下 2)如何在不诉诸ElementScrollBehaviour的情况下解决这个问题?

Ruby代码:

require 'watir-webdriver'

browser = Watir::Browser.new :chrome

begin
  # Step 1
  browser.goto "shop.coles.com.au/online/mobile/national"

  # Step 2 - click on 'Full Website' link at the bottom
  link = browser.link(text: "Full website")

  #check if link exists, present and visible?
  puts link.exists?
  puts link.present?
  puts link.visible?

  #click on link
  link.click

rescue => e
  puts e.inspect
ensure
  sleep 5
end

puts browser.url
browser.close

结果:

$ ruby link_not_clickable.rb

true
true
true

Selenium::WebDriver::Error::UnknownError: unknown error: Element is not clickable at point (460, 1295). Other element would receive the click: div class="shoppingFooter"...div

  (Session info: chrome=50.0.2661.75)
  (Driver info: chromedriver=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform=Mac OS X 10.10.5 x86_64)>
http://shop.coles.com.au/online/mobile/national

谢谢!

5 个答案:

答案 0 :(得分:3)

您可以在任何元素上单击,而不会将其显示。看看这个:

link.fire_event('click')

但是这是非常非常不好的决定,即使它实际上不可见,也会点击该元素,或者只是不可能点击它(因为粘性不好)例如,页脚。)

这就是为什么要等待这个fooler,滚动页面然后点击如下更好:

browser.div(id: "footerMessageArea").wait_until_present
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
link.click

答案 1 :(得分:1)

粘性页脚阻止webdriver执行点击,因此显示“其他元素将收到点击”的消息。

有几种不同的方法可以解决这个问题。

  1. 在点击
  2. 之前向下滚动到页面底部
  3. 在任何/所有链接点击之前隐藏/删除粘性页脚
  4. 在执行单击
  5. 之前,请关注要单击的元素下方的元素

答案 2 :(得分:0)

我猜你的元素在屏幕上可见。

在首先点击元素之前,您必须滚动网页以便元素可见,然后执行单击。希望它能起作用。

答案 3 :(得分:0)

我有类似的问题, 我刚刚使用了以下javascript代码和watir:

<a [resizable-handle]="'.target-container'"> ... </a>
<!-- ...somewhere further, on a different level, the target I don't want to touch in order to get this working... -->
<div class="target-container"> ... </div>

答案 4 :(得分:0)

有时我必须使用.click!我相信是fire_event等价物。基本上某些东西是分层的怪异,你只需要绕过前端的混乱。