0

环境:

  • 红宝石 1.8.7
  • 硒网络驱动程序 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

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

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

所以我目前陷入了一个非常缓慢的解决方案。我不介意这种“发现新 div”的速度有点慢,因为它也会导致脚本开发时间更短。但是,花费几分钟来完成太长了。

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

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

4

1 回答 1

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(“two”)中找到“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") 
于 2013-02-15T22:50:56.077 回答