这是页面代码:
<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
答案 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)
此错误背后有几个原因。我得到了同样的错误,这就是我如何缩小可能的原因。
项目可以位于iframe中,在这种情况下,您必须切换到iFrame并找到元素
另一个原因可能是元素尚未显示,您正在对其执行操作。在这种情况下,您可以应用显式等待,如下所示。
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until{browser_driver.find_element(:xpath,'***').displayed?}
在代码中使用此块可以帮助您等待最多10秒直到项目显示
您的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,以便进行选择器测试。