Ruby/SeleniumWebDriver 2:快速查找新元素

Ruby/SeleniumWebDriver 2:快速查找新元素,ruby,selenium-webdriver,Ruby,Selenium Webdriver,环境: Ruby 1.8.7 Selenium WebDriver 2 Ubuntu 12.04桌面 火狐13.0.1 问题: 我将div标记用作选择项。单击div,将显示一个下拉式窗口,其中包含更多div标记作为选择选项。现在我可以进入并为每个“div as select”创建一种单击这些选项的方法,但我真正想要的是编写一段代码,单击我知道的div,然后确定单击后现在显示并启用哪些div。然后我可以随机点击其中一个选项 我现在的代码是这样的: allDivs = brwsr.find_el

环境:

  • Ruby 1.8.7
  • Selenium WebDriver 2
  • Ubuntu 12.04桌面
  • 火狐13.0.1
问题:

我将div标记用作选择项。单击div,将显示一个下拉式窗口,其中包含更多div标记作为选择选项。现在我可以进入并为每个“div as select”创建一种单击这些选项的方法,但我真正想要的是编写一段代码,单击我知道的div,然后确定单击后现在显示并启用哪些div。然后我可以随机点击其中一个选项

我现在的代码是这样的:

allDivs = brwsr.find_elements(:tag_name, 'div')
origDivs = allDivs
allDivs.each do |e|
  if ... # Get the div I want
    e.click
    newDivs = brwsr.find_elements(:tag_name, 'div')
    origDivs.each do |orig|
      newDivs.delete(orig)
    end
    # Do something with remaining new divs here
  end
end
<div class="outer">
  <div class="one">
    <div class="alpha">A</div>
    <div class="beta">B</div>
    <div class="gamma">C</div>
  </div>
  <div class="two">
    <div class="alpha">A</div>
    <div class="beta">B</div>
    <div class="gamma">C</div>
  </div>
  <div class="three">
    <div class="alpha">A</div>
    <div class="beta">B</div>
    <div class="gamma">C</div>
  </div>
</div>
我的主要问题是速度非常慢。我目前有大约200个div要旋转,这个方法需要几分钟才能完成。通常,我不会期望旋转通过几百个数组元素需要很长时间。但确实如此

为了缩短过滤alldiv和newdiv的时间,我尝试通过旋转它们一次并删除任何未显示和启用的内容

因此,我目前正陷入一个非常缓慢的解决方案。我不介意这个“寻找新div”的过程稍微慢一点,因为它也会缩短脚本开发时间。然而,花几分钟来完成是太长了

第一个问题:Selenium能否仅返回在find_elements调用周围使用一些额外API字符串显示和启用的元素


第二个问题:是否有人有更好的方法来查找新的div元素,而不必遍历元素数组。

如果您可以发布一些您试图自动化的DOM的示例HTML,这将非常有帮助

尽管如此,ruby webdriver绑定确实支持通过链接查找元素。因此,对于一些类似以下内容的html:

allDivs = brwsr.find_elements(:tag_name, 'div')
origDivs = allDivs
allDivs.each do |e|
  if ... # Get the div I want
    e.click
    newDivs = brwsr.find_elements(:tag_name, 'div')
    origDivs.each do |orig|
      newDivs.delete(orig)
    end
    # Do something with remaining new divs here
  end
end
<div class="outer">
  <div class="one">
    <div class="alpha">A</div>
    <div class="beta">B</div>
    <div class="gamma">C</div>
  </div>
  <div class="two">
    <div class="alpha">A</div>
    <div class="beta">B</div>
    <div class="gamma">C</div>
  </div>
  <div class="three">
    <div class="alpha">A</div>
    <div class="beta">B</div>
    <div class="gamma">C</div>
  </div>
</div>
或者,更简单地说,通过ruby的链接功能:

desired_item = brwsr.find_element(:class => "two").find_element(:class => "beta")
我最喜欢的另一种方法是通过CSS选择器选择元素,该选择器使用易于阅读的语法更快地选择元素:

desired_item = brwsr.find_element(:css => "div.two div.beta")