gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:20:57 25 4
gpt4 key购买 nike

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

应用程序使用可变菜单下拉菜单,其中存在标准选项列表,但应用程序每一行上可见的选项会根据特定参数而有所不同。

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 直接访问列表项,但结果是一样的。除非我每次都单击重新生成菜单,否则只有选中的第一个按钮才会显示状态。

最佳答案

Selenium Webdriver 只能与页面上可见的事物进行交互。这就是为什么您必须在遍历可用选项之前单击省略号的原因。这也是您没有获得不可见元素的标签文本的原因。

关于Ruby/Selenium 问题识别列表中显示的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33423732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com