当前位置: 首页 > 知识库问答 >
问题:

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

法浩壤
2023-03-14

我试图理解在我试图识别列表中哪些元素是可见的过程中发生了什么。

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

因此,对于上面的示例,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个答案

奚曦哲
2023-03-14

Selenium Webdrive只能与页面上可见的内容进行交互。这就是为什么您必须在遍历可用选项之前单击省略号。这也是为什么您得不到不可见元素的标签文本。

 类似资料:
  • 英文原文:http://emberjs.com/guides/templates/displaying-a-list-of-items/ 如果你需要枚举一个对象列表,可以使用Handlebar的{{#each}}助手: 1 2 3 4 5 <ul> {{#each people}} <li>Hello, {{name}}!</li> {{/each}} </ul> 对于数组中的

  • 我是android的新手。我已经创建了一个抽屉菜单,并在其中制作了菜单,通过添加片段来实现。现在,对于每个菜单,我都想创建一个带有数组适配器类的自定义列表视图。我实现了它,但问题是列表的每一项中的标题和地址都是相同的。列表只显示最后一项。有人能帮我吗?!我想不出解决方案。这里有一些代码和一张照片: 数组适配器类: 公园班: 一排的公园布局: 列表视图的屏幕截图,所有项目的标题和地址相同

  • 使用以下代码: 我得到: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23。 我想做的是每 10 个项目中断一次行,以便获得: 0,1,2,3,4,5,6,7,8,9, 10,11,12,13,14,15,16,17,18,19, 20,21,22,23. 我在谷歌搜索后尝试了很多事情,但都没有成功!你能帮助我吗? 谢谢 奥

  • 我试图显示woocommerce产品子类别的列表,包括任何子类别(的子类别)-如何修改以下代码来执行此操作-其中显示cat ID 51中的类别列表:

  • 我有这个对象显示在一个组合框中: 我想把这个列表显示到一个组合框中。 问题是如何将组的名称从对象显示到组合框中?

  • 您可以使用#each帮助程序显示数组中的项列表,并为数组中的每个项迭代一次。 语法 (Syntax) <ul> {{#each array_name as |block-param| }} <li>{{block-param}}</li> {{/each}} </ul> 在上面的代码中,模板迭代array_name ,其中包括对象和指定为block-param的数组中的每