使用 'watir-webdriver' 模拟嵌套 link 点击

Simulating a nested link click with 'watir-webdriver'

我正在使用以下 HTML 来模拟 link 点击嵌套在

中的 'watir-webdriver'
<li>
<div class="drop-head">
<ul>
    <li>
        <a href="#hotel" aria-label="go to Hotels" title="Hotels">Hotels</a>
    </li>
.....
</ul>
</div>

我的脚本很基础:

require 'watir-webdriver'

browser = Watir::Browser.new :firefox
browser.goto "https://www.acme,com/reserve"
wait = Selenium::WebDriver::Wait.new(:timeout => 5)

menu = browser.div(:class => "drop-head").li.a(:href => "#hotel").click

在控制台中,我看到以下错误:

C:/apps/Ruby23/lib/ruby/gems/2.3.0/gems/watir-webdriver-0.9.9/lib/watir-webdriver/elements/element.rb:536:in `assert_element_found': unable to locate element, using {:href=>"#hotel", :tag_name=>"a"} (Watir::Exception::UnknownObjectException)
        from C:/apps/Ruby23/lib/ruby/gems/2.3.0/gems/watir-webdriver-0.9.9/lib/watir-webdriver/elements/element.rb:508:in `assert_exists'
        from C:/apps/Ruby23/lib/ruby/gems/2.3.0/gems/watir-webdriver-0.9.9/lib/watir-webdriver/elements/element.rb:114:in `click'
        from script4.rb:7:in `<main>'

有什么帮助吗?

问题可能是对元素路径的过度指定。当你这样做时:

menu = browser.div(:class => "drop-head").li.a(:href => "#hotel").click

它实际上找到了第一个匹配的 "drop-head" div 和第一个 li 元素。鉴于每个 link 可能在其自己的 li 元素中,您将只能找到第一个 link。例如:

<div class="drop-head">
  <ul>
    <li>
      <a href="#hotel" aria-label="go to Hotels" title="Hotels">Hotels</a>
    </li>
    <li>
      <a href="#restaurants" aria-label="go to Restaurants" title="Restaurants">Restaurants</a>
    </li>
  </ul>
</div>

寻找第二个link,“#restaurants”:

browser.div(:class => "drop-head").li.a(:href => "#restaurants")

实际上会在第一个 li 元素中寻找 link:

<li>
 <a href="#hotel" aria-label="go to Hotels" title="Hotels">Hotels</a>
</li>

解决方案是仅在确实需要区分元素时才指定元素的路径。假设只有一个 link 和 href,你可以这样做:

browser.a(:href => "#hotel").click