有没有办法确定使用Selenium和Watir在Chrome浏览器中是否可以点击某个元素?

时间:2018-06-01 13:38:35

标签: ruby selenium-webdriver selenium-chromedriver watir

据我了解,由于使用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--工作流程。

2 个答案:

答案 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;无头"你的测试模式。