我试图了解在尝试识别列表中哪些元素可见时发生了什么。
应用程序使用变量菜单下拉列表,其中存在标准的选项列表,但应用程序每行上可见的选项因某些参数而异。
因此,对于上面的示例,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直接访问列表项,但结果是一样的。除非我每次都单击重新生成菜单,否则只有选中的第一个按钮才会显示状态。
答案 0 :(得分:1)
Selenium Webdriver只能与页面上可见的内容进行交互。这将是您在迭代可用选项之前必须单击省略号的原因。这也是您没有获得不可见元素的标签文本的原因。