2012-10-08 76 views
0

环境:红宝石/硒的webdriver 2:寻找新的元素快速

  • 的Ruby 1.8.7
  • 硒的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 

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

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

所以我目前坚持一个非常缓慢的解决方案。我不介意这个'发现新的div'有点慢,因为它也会导致脚本开发时间更短。然而,花几分钟时间完成太长。

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

第二个问题:有没有人有更好的方法来找到新的div元素,而不必通过元素数组。

回答

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

或者,即使更简单地说,通过红宝石的链接功能:

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

另一种方式,这是我比较喜欢的最多的是通过CSS选择器,它选择的元素与轻松快速地读取语法选择一个元素:

desired_item = brwsr.find_element(:css => "div.two div.beta") 
相关问题