Ruby / Selenium WebDriver 2:快速查找新元素

时间:2012-10-08 21:40:06

标签: ruby selenium-webdriver

环境:

  • Ruby 1.8.7
  • Selenium WebDriver 2
  • Ubuntu 12.04桌面
  • Firefox 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

我遇到的主要问题是这个问题非常缓慢。我目前有大约200个div来旋转,这个方法需要几分钟才能完成。通常情况下,我不希望通过几百个数组元素旋转需要很长时间。但确实如此。

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

所以我目前陷入了一个非常缓慢的解决方案。我不介意这个'新div的发现'有点慢,因为它也应该导致更短的脚本开发时间。但是,花费几分钟才能完成太久了。

第一个问题: Selenium是否只能返回在find_elements调用周围显示并启用了一些额外API字符串的元素?

第二个问题:有人有更好的方法来查找新的div元素而无需通过元素数组。

1 个答案:

答案 0 :(得分:0)

如果您可以发布一些您想要自动化的DOM的示例HTML,那将非常有用。

话虽如此,ruby webdriver绑定确实支持通过链接查找元素。因此,给出一些像这样的HTML:

<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>

你可以写这样的东西来找到第二组div中的“B”div(“两个”):

group = brwsr.find_element(:class => "two")
desired_item = group.find_element(:class => "beta")

或者,更简单地通过ruby的链接功能:

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

另一种方式,我最喜欢的是通过CSS选择器选择一个元素,它通过易于阅读的语法更快地选择元素:

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