无法使用 watir 单击 html 元素
Cannot click html element with watir
我想点击下面的"button",但是点击不了。
html是:
<table onclick="filtersJob_intrinsic_extender.addRow();return false;" class="FilterList_addLink">
<tbody>
<tr>
<td class="icon"><img src="/commander/lib/images/icn12px_add.gif" alt="Add Filter"></td>
<td class="text">Add Intrinsic Filter</td>
</tr>
</tbody>
</table>
我基本上是用 watir 和 watir-webdriver 做的:
browser.td(:text => 'Add Intrinsic Filter').click
我在另一个网站的另一个类似按钮上尝试了这个方法,它起作用了。我想知道为什么它在这里不起作用。
导致异常:
Selenium::WebDriver::Error::ElementNotVisibleError in 'your rspec spec code'
Element is not currently visible and so may not be interacted with[remote server] file:///C:/Users/john/AppData/Local/Temp/webdriver-profile20150402-8208-15kr0zm/extensions/fxdriver@googlecode.com/components/command_processor.js:7736:in `fxdriver.preconditions.visible'
[remote server] file:///C:/Users/john/AppData/Local/Temp/webdriver-profile20150402-8208-15kr0zm/extensions/fxdriver@googlecode.com/components/command_processor.js:10437:in `DelayedCommand.prototype.checkPreconditions_'
[remote server] file:///C:/Users/john/AppData/Local/Temp/webdriver-profile20150402-8208-15kr0zm/extensions/fxdriver@googlecode.com/components/command_processor.js:10456:in `DelayedCommand.prototype.executeInternal_/h'
[remote server] file:///C:/Users/john/AppData/Local/Temp/webdriver-profile20150402-8208-15kr0zm/extensions/fxdriver@googlecode.com/components/command_processor.js:10461:in `DelayedCommand.prototype.executeInternal_'
[remote server] file:///C:/Users/john/AppData/Local/Temp/webdriver-profile20150402-8208-15kr0zm/extensions/fxdriver@googlecode.com/components/command_processor.js:10401:in `DelayedCommand.prototype.execute/<'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/response.rb:51:in `assert_ok'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/response.rb:15:in `initialize'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/http/common.rb:59:in `new'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/http/common.rb:59:in `create_response'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/http/default.rb:66:in `request'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/http/common.rb:40:in `call'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/bridge.rb:629:in `raw_execute'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/bridge.rb:607:in `execute'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/bridge.rb:364:in `clickElement'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/common/element.rb:54:in `click'
问题
从注释中我们看到实际上有 51 个 td 元素具有文本 "Add Intrinsic Filter":
browser.tds(:text => 'Add Intrinsic Filter').length
#=> 51
我们还看到其中一些单元格可见,而另一些则不可见 - 即当为每个单元格调用 .visible?
时,一些返回 true 而另一些返回 false:
browser.tds(:text => 'Add Intrinsic Filter').map(&:visible?).uniq
#=> [false, true]
定位单个元素时,Watir 将选择第一个匹配的元素。在这种情况下,我们可以推断第一个带有文本 "Add Intrinsic Filter" 的单元格不可见:
* Selenium::WebDriver::Error::ElementNotVisibleError 异常不可见。
* 根据 browser.tds(:text => 'Add Intrinsic Filter').map(&:visible?).uniq
结果的排序,第一个元素不可见。
没有看到页面,我们只能假设第一个匹配的单元格不是您真正想要点击的单元格。
解决方案
您需要确定 51 个单元格中的哪一个实际上是您要单击的单元格,然后使用更具体的定位器。
基于 Selenium IDE 的结果,您可以:
browser.td(:xpath => '//tr[@id="filtersJob_intrinsic_container"]/td[2]/table[2]/tbody/tr/td[2]').click
指定元素的整个路径可能不易更改,因此您可能想尝试一些不那么具体的方法。也许尝试定位具有特定 ID 的行,然后定位具有特定文本的单元格:
browser.tr(:id => 'filtersJob_intrinsic_container').td(:class => 'text', :text => 'Add Intrinsic Filter').click
请注意,添加 :class
作为定位符是为了尝试获取内部 td 而不是外部 td。
我想点击下面的"button",但是点击不了。
html是:
<table onclick="filtersJob_intrinsic_extender.addRow();return false;" class="FilterList_addLink">
<tbody>
<tr>
<td class="icon"><img src="/commander/lib/images/icn12px_add.gif" alt="Add Filter"></td>
<td class="text">Add Intrinsic Filter</td>
</tr>
</tbody>
</table>
我基本上是用 watir 和 watir-webdriver 做的:
browser.td(:text => 'Add Intrinsic Filter').click
我在另一个网站的另一个类似按钮上尝试了这个方法,它起作用了。我想知道为什么它在这里不起作用。
导致异常:
Selenium::WebDriver::Error::ElementNotVisibleError in 'your rspec spec code'
Element is not currently visible and so may not be interacted with[remote server] file:///C:/Users/john/AppData/Local/Temp/webdriver-profile20150402-8208-15kr0zm/extensions/fxdriver@googlecode.com/components/command_processor.js:7736:in `fxdriver.preconditions.visible'
[remote server] file:///C:/Users/john/AppData/Local/Temp/webdriver-profile20150402-8208-15kr0zm/extensions/fxdriver@googlecode.com/components/command_processor.js:10437:in `DelayedCommand.prototype.checkPreconditions_'
[remote server] file:///C:/Users/john/AppData/Local/Temp/webdriver-profile20150402-8208-15kr0zm/extensions/fxdriver@googlecode.com/components/command_processor.js:10456:in `DelayedCommand.prototype.executeInternal_/h'
[remote server] file:///C:/Users/john/AppData/Local/Temp/webdriver-profile20150402-8208-15kr0zm/extensions/fxdriver@googlecode.com/components/command_processor.js:10461:in `DelayedCommand.prototype.executeInternal_'
[remote server] file:///C:/Users/john/AppData/Local/Temp/webdriver-profile20150402-8208-15kr0zm/extensions/fxdriver@googlecode.com/components/command_processor.js:10401:in `DelayedCommand.prototype.execute/<'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/response.rb:51:in `assert_ok'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/response.rb:15:in `initialize'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/http/common.rb:59:in `new'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/http/common.rb:59:in `create_response'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/http/default.rb:66:in `request'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/http/common.rb:40:in `call'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/bridge.rb:629:in `raw_execute'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/bridge.rb:607:in `execute'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/remote/bridge.rb:364:in `clickElement'
C:/ruby/lib/ruby/gems/1.8/gems/selenium-webdriver-2.33.0/lib/selenium/webdriver/common/element.rb:54:in `click'
问题
从注释中我们看到实际上有 51 个 td 元素具有文本 "Add Intrinsic Filter":
browser.tds(:text => 'Add Intrinsic Filter').length
#=> 51
我们还看到其中一些单元格可见,而另一些则不可见 - 即当为每个单元格调用 .visible?
时,一些返回 true 而另一些返回 false:
browser.tds(:text => 'Add Intrinsic Filter').map(&:visible?).uniq
#=> [false, true]
定位单个元素时,Watir 将选择第一个匹配的元素。在这种情况下,我们可以推断第一个带有文本 "Add Intrinsic Filter" 的单元格不可见:
* Selenium::WebDriver::Error::ElementNotVisibleError 异常不可见。
* 根据 browser.tds(:text => 'Add Intrinsic Filter').map(&:visible?).uniq
结果的排序,第一个元素不可见。
没有看到页面,我们只能假设第一个匹配的单元格不是您真正想要点击的单元格。
解决方案
您需要确定 51 个单元格中的哪一个实际上是您要单击的单元格,然后使用更具体的定位器。
基于 Selenium IDE 的结果,您可以:
browser.td(:xpath => '//tr[@id="filtersJob_intrinsic_container"]/td[2]/table[2]/tbody/tr/td[2]').click
指定元素的整个路径可能不易更改,因此您可能想尝试一些不那么具体的方法。也许尝试定位具有特定 ID 的行,然后定位具有特定文本的单元格:
browser.tr(:id => 'filtersJob_intrinsic_container').td(:class => 'text', :text => 'Add Intrinsic Filter').click
请注意,添加 :class
作为定位符是为了尝试获取内部 td 而不是外部 td。