Selenium Webdriver(Ruby):无法点击按钮 - 找不到元素

时间:2014-08-18 17:34:01

标签: ruby selenium selenium-webdriver webdriver

这是页面代码:

<div class="modal-buttons">

    <button class="button-orange" ng-click="cancel()">
        <span>

            Cancel

        </span>
        <span class="icon cancel"></span>
    </button>
    <button class="button-orange" ng-click="apply()">
        <span>

            Apply

        </span>
        <span class="icon run"></span>
    </button>

正如你所看到的 - 这个模态有两个按钮,我尝试了十几种不同的方式 - 但我只想点击标有&#34的按钮;应用&#34;无论我采取哪种方式 - 它只是说元素不可见。

以下是我尝试过的一些事情:

#   @driver.find_element(:class, "button-orange")[2].click
#   @driver.find_element(:xpath, "//div[4]/div/div[2]/div[3]/button[2]").click
# @driver. find_element(:link_text, 'Apply').click
#   @driver. find_element(:tag, 'Apply').click
# @driver.find_element(:css, "input[value='Apply']").click();
#  @driver.find_element(:css, "input[value='Apply']").click();
# @driver.find_element(:xpath, "//button[contains(text(),'Apply')]").click
# @driver.find_element(:xpath, "//button[contains(text(),'apply')]").click
# @driver.find_element(:xpath, "//input[@value='Apply']").click();
#   @driver.find_element(:class, "button-orange.icon-run").click
#  @driver.find_element(:css,'a[class$="button-orange"]').click
#   @driver.find_element(:xpath, "").clear

我得到的确切错误是:

Error: test_login_to_chute(LoginToChute)
  Selenium::WebDriver::Error::ElementNotVisibleError: element not visible
    (Session info: chrome=36.0.1985.125)
    (Driver info: chromedriver=2.10.267521,platform=Windows NT 6.3 x86_64)
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdr
iver/remote/response.rb:51:in `assert_ok'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdr
iver/remote/response.rb:15:in `initialize'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdr
iver/remote/http/common.rb:59:in `new'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdr
iver/remote/http/common.rb:59:in `create_response'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdr
iver/remote/http/default.rb:66:in `request'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdr
iver/remote/http/common.rb:40:in `call'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdr
iver/remote/bridge.rb:634:in `raw_execute'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdr
iver/remote/bridge.rb:612:in `execute'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdr
iver/remote/bridge.rb:369:in `clickElement'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.42.0/lib/selenium/webdr
iver/common/element.rb:54:in `click'
C:/Analytics/AutomatedTesting/DevEnv/Wonderland/Full Regression/2.login_to_chute
.rb:165:in `test_login_to_chute'
     162:       @driver.find_element(:xpath, "(//input[@type='text'])[8]").clear

     163:       @driver.find_element(:xpath, "(//input[@type='text'])[8]").send_
keys "25"
     164:
  => 165: @driver.find_element(:xpath, "//div[4]/div/div[2]/div[3]/button[2]").c
lick

3 个答案:

答案 0 :(得分:1)

非常感谢你们的帮助。

这就是最终达成协议的目的。

因为网站是一个有角度的页面,所以它在后台加载了很多东西。包括实际上不可见的多个其他按钮。

所以我最终使用的是:

@driver.find_elements(:xpath, "//button")[-1].click

我将find_element变量更新为仅查找可见元素。

def find_visible_element(how, what)
 elems = @driver.find_elements(how, what).select { |e| e.displayed? }
 len = elems.length
 if len == 0
  raise "No matches found."
 elsif len > 1
  raise "Ambiguous match. Found #{len} matches."
 end
 elems.first
end

答案 1 :(得分:1)

此错误背后有几个原因。我得到了同样的错误,这就是我如何缩小可能的原因。

  1. 项目可以位于iframe中,在这种情况下,您必须切换到iFrame并找到元素

  2. 另一个原因可能是元素尚未显示,您正在对其执行操作。在这种情况下,您可以应用显式等待,如下所示。

    wait = Selenium::WebDriver::Wait.new(:timeout => 10)
    wait.until{browser_driver.find_element(:xpath,'***').displayed?}
    

    在代码中使用此块可以帮助您等待最多10秒直到项目显示

  3. 您的xpath可能会向驱动程序返回多于1个Web元素,即可以使用相同的xpath定位多个元素。在这种情况下,请确保您的xpath更具体,并且只返回一个Web元素。第三种可能性解决了我的问题。

答案 2 :(得分:0)

等待整个javascript模态完全加载(例如,使用Wait块)

此外,您必须使用正确的选择器。坦率地说,很少有你的示例选择器在你发布的html的上下文中没有任何意义。

在Chrome的检查器中,确保点击鼠标点击的内容。您是否尝试过选择<span>

尝试其中一些:

:css => "button.button-orange[ng-click='apply()']"
:xpath => "//button[@ng-click='apply()']"
:xpath => "//button/span[contains(text(),'Apply')]/.."

:css => "button.button-orange[ng-click='apply()'] > span"
:xpath => "//button[@ng-click='apply()']/span"
:xpath => "//button/span[contains(text(),'Apply')]"

顺便说一句,chrome的元素检查器有一个find函数,可以搜索xpath和css,以便进行选择器测试。