元素不可点击错误 Ruby / Watir
Element is not clickable error Ruby / Watir
在我的测试中,我试图点击 etsy.com,进行搜索,点击结果,然后将商品添加到我的购物车。在尝试单击 'add to cart' 按钮之前,我可以做任何事情。下面的代码实际上在 IRB 中有效,所以我知道我的定位器是可靠的,但是当我 运行 测试时,我得到一个元素在点错误
时无法点击
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/selenium-webdriver-3.6.0/lib/selenium/webdriver/remote/response.rb:71:in 'assert_ok': unknown error: Element is not clickable at point (930, 586) (Selenium::WebDriver::Error::UnknownError)
(Session info: chrome=61.0.3163.100)
这是我的测试
require 'watir'
# test that a user can search for and add an item to shopping cart
b = Watir::Browser.new :chrome
begin
b.goto "http://etsy.com"
b.text_field(:id => 'search-query').set 'bacon is my spirit animal coaster'
b.button(:value => 'Search').present?
b.button(:value => 'Search').click
b.p(:text => /Bacon Spirit Animal Coaster/).click
b.select_list(:id => 'inventory-variation-select-0').option(:text => 'Single (.00)').select
b.button(:text => /Add to cart/).click
if b.text.include?("item in your cart")
puts "Test passed!"
else
puts "Test failed!"
end
ensure
b.close
end
这里是按钮的页面 HTML。
<button class="btn-transaction" type="submit">
<div class="btn-text">Add to cart</div>
<div class="ui-toolkit">
<div class="btn-spinner spinner spinner-small display-none"></div>
</div>
</button>
根据浏览器的宽度(可能还有其他因素),“添加到购物车”按钮上可能会浮动对话框。例如,当我的测试失败时,按钮顶部有一个开始对话框。 Chrome 尝试点击某个位置。如果另一个元素在该位置位于您的元素之上,Chrome 将抛出异常。
最简单的解决方案是通过直接触发点击事件来绕过Chrome的检查:
# Watir > 6.8.0:
b.button(:text => /Add to cart/).click! # note the exclamation mark
# Watir < 6.8.0:
b.button(:text => /Add to cart/).fire_event(:onclick)
其他可能有条件地起作用的解决方案:
- 单击按钮前最大化浏览器 -
browser.window.maximize
。这可以将浮动元素从按钮上移开。
- 关闭浮动对话框。
在我的测试中,我试图点击 etsy.com,进行搜索,点击结果,然后将商品添加到我的购物车。在尝试单击 'add to cart' 按钮之前,我可以做任何事情。下面的代码实际上在 IRB 中有效,所以我知道我的定位器是可靠的,但是当我 运行 测试时,我得到一个元素在点错误
时无法点击C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/selenium-webdriver-3.6.0/lib/selenium/webdriver/remote/response.rb:71:in 'assert_ok': unknown error: Element is not clickable at point (930, 586) (Selenium::WebDriver::Error::UnknownError)
(Session info: chrome=61.0.3163.100)
这是我的测试
require 'watir'
# test that a user can search for and add an item to shopping cart
b = Watir::Browser.new :chrome
begin
b.goto "http://etsy.com"
b.text_field(:id => 'search-query').set 'bacon is my spirit animal coaster'
b.button(:value => 'Search').present?
b.button(:value => 'Search').click
b.p(:text => /Bacon Spirit Animal Coaster/).click
b.select_list(:id => 'inventory-variation-select-0').option(:text => 'Single (.00)').select
b.button(:text => /Add to cart/).click
if b.text.include?("item in your cart")
puts "Test passed!"
else
puts "Test failed!"
end
ensure
b.close
end
这里是按钮的页面 HTML。
<button class="btn-transaction" type="submit">
<div class="btn-text">Add to cart</div>
<div class="ui-toolkit">
<div class="btn-spinner spinner spinner-small display-none"></div>
</div>
</button>
根据浏览器的宽度(可能还有其他因素),“添加到购物车”按钮上可能会浮动对话框。例如,当我的测试失败时,按钮顶部有一个开始对话框。 Chrome 尝试点击某个位置。如果另一个元素在该位置位于您的元素之上,Chrome 将抛出异常。
最简单的解决方案是通过直接触发点击事件来绕过Chrome的检查:
# Watir > 6.8.0:
b.button(:text => /Add to cart/).click! # note the exclamation mark
# Watir < 6.8.0:
b.button(:text => /Add to cart/).fire_event(:onclick)
其他可能有条件地起作用的解决方案:
- 单击按钮前最大化浏览器 -
browser.window.maximize
。这可以将浮动元素从按钮上移开。 - 关闭浮动对话框。