Watir-webdriver 抛出 'not clickable' 错误,即使元素可见,存在
Watir-webdriver throws 'not clickable' error even when element is visible, present
我正在尝试使用最新的 Watir-Webdriver 0.9.1、Selenium-Webdriver 2.53 在 Ruby 中自动化测试.0 和 Chrome 扩展 2.21。但是,我正在测试的网站在顶部有静态 headers,有时在底部有静态页脚。因此,由于 Watir auto-scrolls 元素在单击之前进入视图,因此元素隐藏在静态 header 或静态页脚下。我不想将 desired_capabitlites (ElementScrollBehavior)
设置为 1
或 0
,因为我正在测试的网站可能同时具有静态 header 或静态页脚或两者。
因此问题是:
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
谢谢!
粘性页脚阻止 webdriver 执行点击,因此消息显示 'other element would receive the click'。
有几种不同的方法可以解决这个问题。
- 点击前向下滚动到页面底部
- Hide/Delete any/all link 点击前的粘性页脚
- 在执行单击之前,将焦点放在要单击的元素下方的元素上
我猜你的元素在屏幕上是可见的。
在单击该元素之前,您必须先滚动网页以便该元素可见,然后再执行单击。希望它能奏效。
您可以在任何元素上单击而不使其可见。看看这个:
link.fire_event('click')
BUT 就它会点击该元素而言,即使它实际上不可见或无法点击它,这也是一个非常非常糟糕的决定(例如,由于粘性页脚损坏)。
这就是为什么等待傻瓜更好,滚动页面然后点击赞:
browser.div(id: "footerMessageArea").wait_until_present
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
link.click
我有类似的问题,
我只是在 watir 中使用了以下 javascript 代码:
link = browser.link(text: "Full website")
@browser.execute_script("arguments[0].focus(); arguments[0].click();", link)
有时我不得不使用.click!我认为这是 fire_event 等价物。基本上有些东西很奇怪,你只需要绕过前端混乱。
我正在尝试使用最新的 Watir-Webdriver 0.9.1、Selenium-Webdriver 2.53 在 Ruby 中自动化测试.0 和 Chrome 扩展 2.21。但是,我正在测试的网站在顶部有静态 headers,有时在底部有静态页脚。因此,由于 Watir auto-scrolls 元素在单击之前进入视图,因此元素隐藏在静态 header 或静态页脚下。我不想将 desired_capabitlites (ElementScrollBehavior)
设置为 1
或 0
,因为我正在测试的网站可能同时具有静态 header 或静态页脚或两者。
因此问题是:
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
谢谢!
粘性页脚阻止 webdriver 执行点击,因此消息显示 'other element would receive the click'。
有几种不同的方法可以解决这个问题。
- 点击前向下滚动到页面底部
- Hide/Delete any/all link 点击前的粘性页脚
- 在执行单击之前,将焦点放在要单击的元素下方的元素上
我猜你的元素在屏幕上是可见的。
在单击该元素之前,您必须先滚动网页以便该元素可见,然后再执行单击。希望它能奏效。
您可以在任何元素上单击而不使其可见。看看这个:
link.fire_event('click')
BUT 就它会点击该元素而言,即使它实际上不可见或无法点击它,这也是一个非常非常糟糕的决定(例如,由于粘性页脚损坏)。
这就是为什么等待傻瓜更好,滚动页面然后点击赞:
browser.div(id: "footerMessageArea").wait_until_present
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
link.click
我有类似的问题, 我只是在 watir 中使用了以下 javascript 代码:
link = browser.link(text: "Full website")
@browser.execute_script("arguments[0].focus(); arguments[0].click();", link)
有时我不得不使用.click!我认为这是 fire_event 等价物。基本上有些东西很奇怪,你只需要绕过前端混乱。