Ruby / Selenium问题识别列表中显示的项目

时间:2015-10-29 20:13:08

标签: ruby selenium

我试图了解在尝试识别列表中哪些元素可见时发生了什么。

应用程序使用变量菜单下拉列表,其中存在标准的选项列表,但应用程序每行上可见的选项因某些参数而异。

example of menu dropdown

因此,对于上面的示例,HTML看起来像......

    <ul>
        <li id="liAddResource" style="display: list-item;"></li>
        <li id="liEditResource" style="display: none;"></li>
        <li id="liAddBarrier" style="display: none;"></li>
        <li id="liEditBarrier" style="display: none;"></li>
        <li id="liRemoveTask" style="display: list-item;"></li>
        <li id="liRemoveResource" style="display: none;"></li>
        <li id="liRemoveBarrier" style="display: none;"></li>
    </ul>

如您所见,显示的两个项目具有显示样式,其他项目为“无”。

我的想法是获取所有列表项,然后循环浏览它们以确定显示哪些选项。

    buttons=@driver.find_elements(xpath: button_path)
    puts "verify_displayed_action_buttons:  Buttons are:")
    buttons.each_with_index do |b,i|
      puts "     Button: #{i}"
      puts "               Label:#{b.text}"
      id=b.attribute('id')
      puts "               ID: #{id}"
      displayed=b.displayed?
      puts "               Displayed Status: #{displayed}"
    end

但是,使用此方法时,只显示两个选项中的第一个。

 Button: 0
           Label:Add Resource
           ID: liAddResource
           Displayed Status: true
 Button: 1
           Label:
           ID: liEditResource
           Displayed Status: false
 Button: 2
           Label:
           ID: liAddBarrier
           Displayed Status: false
 Button: 3
           Label:
           ID: liEditBarrier
           Displayed Status: false
 Button: 4
           Label:
           ID: liRemoveTask
           Displayed Status: false
 Button: 5
           Label:
           ID: liRemoveResource
           Displayed Status: false
 Button: 6
           Label:
           ID: liRemoveBarrier
           Displayed Status: false

但是,如果在检查每个项目的状态之前,我点击省略号并强制重新加载菜单,我会得到相应的结果。

    puts "verify_displayed_action_buttons:  Buttons are:"
    buttons.each_with_index do |b,i|
    #click on the ellipses to repaint the menu
    action_cell=@driver.find_element(id: ellipses_id)
    action_cell.click
    buttons=@driver.find_elements(xpath: button_path)
      b=buttons[i]
      puts "     Button: #{i}"
      puts "               Label:#{b.text}"
      id=b.attribute('id')
      puts "               ID: #{id}"
      displayed=b.displayed?
      puts "               Displayed Status: #{displayed}"
    end

输出 - 现在显示按钮4的状态。

 Button: 0
           Label:Add Resource
           ID: liAddResource
           Displayed Status: true
 Button: 1
           Label:
           ID: liEditResource
           Displayed Status: false
 Button: 2
           Label:
           ID: liAddBarrier
           Displayed Status: false
 Button: 3
           Label:
           ID: liEditBarrier
           Displayed Status: false
 Button: 4
           Label:Remove Task
           ID: liRemoveTask
           Displayed Status: true
 Button: 5
           Label:
           ID: liRemoveResource
           Displayed Status: false
 Button: 6
           Label:
           ID: liRemoveBarrier
           Displayed Status: false

它的作用好像是在询问由find_elements调用产生的第一个元素的显示状态,以某种方式改变了后面元素的状态。

任何有关此处发生的事情的建议以及如何在不点击图标的情况下我可以做到这一点,以便每次都重新生成菜单,我们将不胜感激。在完整的回归测试期间,这个动作需要花费数千次,每次我想检查它时都要花费很多。

更新 - 我还应该补充一点,我确实尝试通过他们的ID直接访问列表项,但结果是一样的。除非我每次都单击重新生成菜单,否则只有选中的第一个按钮才会显示状态。

1 个答案:

答案 0 :(得分:1)

Selenium Webdriver只能与页面上可见的内容进行交互。这将是您在迭代可用选项之前必须单击省略号的原因。这也是您没有获得不可见元素的标签文本的原因。