据我了解,由于使用Selenium Webdriver和Chromedriver实现点击事件的方式,使用Chrome浏览器执行Web测试自动化时,此问题才真正有用。作为前言,我使用并意识到通过使用Watir元素函数来找到一个元素" present?",据我所知,它基本上是"可见的组合?"并且"存在?"。我还可以根据需要找到一个带有Webdriver元素函数的元素,以识别元素是否存在,如果不存在则为异常提供救援。我想确定的是以下内容:
有时,由于缺乏对页面的响应性,将会找到页面元素并通过所有验证测试以确定它是否存在,但由于上述缺乏,因此无法主动实际进行交互页面响应度。使用Chrome浏览器(使用Chromedriver)尝试与这些元素进行交互将导致错误:
IRB(主):003:0> @ browser.button(:id," button_login")。现在? =>真正 IRB(主):004:0> @ browser.button(:id," button_login")。点击 Selenium :: WebDriver :: Error :: UnknownError:未知错误:元素...在点上无法点击(915, nt会收到点击:
...
(会话信息:chrome = 66.0.3359.181) (驱动程序信息:chromedriver = 2.38.552522(437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),platform = Windows NT 6.3.9600 x86_64) 来自C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/remote/response.rb:69:in' assert_ok' 来自C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/remote/response.rb:32:in' initialize' 来自C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/remote/http/common.rb:83:in&& 39; new&#39 ; 来自C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/remote/http/common.rb:83:in' create_response&#39 ; 来自C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/remote/http/default.rb:107:in' request&#39 ; 来自C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/remote/http/common.rb:61:in' call&#39 ; 来自C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/remote/bridge.rb:170:在'执行' 来自C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/remote/oss/bridge.rb:579:in'执行&#39 ; 来自C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/remote/oss/bridge.rb:328:in' click_element&#39 ; 来自C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/common/element.rb:74:在'点击' 来自C:/Ruby23/lib/ruby/gems/2.3.0/gems/watir-6.4.1/lib/watir/elements/element.rb:131:在'阻止点击' 来自C:/Ruby23/lib/ruby/gems/2.3.0/gems/watir-6.4.1/lib/watir/elements/element.rb:656:in' element_call' 来自C:/Ruby23/lib/ruby/gems/2.3.0/gems/watir-6.4.1/lib/watir/elements/element.rb:122:点击' 来自(irb):4 来自C:/Ruby23/bin/irb.cmd:19:''
我知道我现在可以解救,但这需要我实际点击该元素。基本上我想写一个特殊功能"可点击?"这将返回一个布尔输出而不实际单击该元素并可能导航离开该页面。我宁愿不尝试使用--ctrl + click类型,如果新窗口返回true,关闭窗口,将焦点设置在第一个窗口,rescue return false--工作流程。
答案 0 :(得分:1)
不幸的是,目前(Watir 6.11)并不是一种检查元素是否可点击的方法 - 除了实际尝试点击它之外。将来可能会出现 - 请参阅https://github.com/watir/watir/issues/532中我们尝试自动重试点击的讨论。
我会尝试等待重叠元素消失。
如果重叠类似于最终会消失的叠加层,那么它相对简单 - 例如:
browser.element(id: 'overlapping_element').wait_while(&:present?)
如果重叠元素被移动而不是消失或者您不知道重叠元素,则可以尝试近似重叠元素检查。当Chrome点击某个元素时,它会获取该元素的中心位置,然后点击该点。如果该点的顶级元素不是您的元素,则抛出异常。以下等待将执行此检查,直到没有重叠元素:
target = browser.button
target_children = target.elements.to_a
browser.wait_until do
location = target.location
size = target.size
center = [location.x + size.width/2, location.y + size.height/2]
element_at_point = browser.execute_script("return document.elementFromPoint(#{center[0]}, #{center[1]});")
[target, target_children].flatten.include?(element_at_point)
end
target.click
请注意,之前我没有这么做过,所以我不知道是否有边缘情况。似乎可以使用Chrome和Firefox。
答案 1 :(得分:0)
我建议您等待此按钮显示在网页上。我遇到了同样的问题(我在测试中使用了XPath)。解决它:
首先,我定义了2个辅助方法,因为我必须重复使用它们。一个用于在页面上搜索确切元素(此方法通常需要一段时间才能返回结果,因此您不需要sleep
浏览器),另一个用于单击具有给定&#34的按钮; ID"
module Helpers
module Common
def wait_for_element_id(value)
find(:xpath, "(//*[@id='#{value}'])[1]")
end
def click_button_with_id(value)
first(:xpath, "//button[@id='#{value}']").click
end
end
end
在测试之后,您可以使用辅助方法,如:
it 'clicks on the login button and magic is executed' do
logout(user)
wait_for_element_id('button_login')
click_button_with_id('button_login')
expect(magic).to be_executed
end
我也不确定,但是你也可以体验同一个项目,因为浏览器窗口大小(因为尺寸太小而没有显示按钮),或者因为#34;无头"你的测试模式。