2015-10-29 39 views
2

我試圖瞭解在嘗試確定列表中哪些元素可見時發生了什麼。識別列表中顯示項目的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> 

正如你所看到的,所顯示的兩個項目,有一個顯示樣式,其他地方是「沒有」。

我的想法是抓住所有的列表項,然後在它們之間循環以確定顯示哪些選項。

[email protected]_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 
    [email protected]_element(id: ellipses_id) 
    action_cell.click 
    [email protected]_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

Selenium Webdriver只能與頁面上可見的東西進行交互。這就是爲什麼在遍歷可用選項之前必須單擊省略號。這也是爲什麼你沒有得到不可見元素的標籤文本。

+0

我絕對明白這一點,謝謝大衛。但這裏是我感到困惑的地方。當我執行find_elements並將它們全部帶回時,有兩個按鈕可見,#1和#4。如果我檢查.displayed?任何一方的地位,我都會得到一個「真實」的迴應。但是如果我連續檢查其中兩個,我會在第一個響應中得到「真實」,在第二個響應中得到「虛假」。爲什麼僅僅通過檢查第一個元素的可見狀態來改變第二個元素的可見狀態?任何見解都會很棒。 –

+0

如果您執行'puts buttons.each.map(&:顯示?)',您會得到什麼輸出?使用您在問題中給出的html,我會得到'true false false false false false',這是正確的。 –