2015-04-05 116 views
2

我有一個Selenium Webdriver的問題。我正在運行鍼對Web應用程序的自動測試,並進行測試以檢查元素的可見性。當我在CLI中運行同一行腳本時,找到該元素,並且is_displayed()返回「TRUE」,但當我通過Python IDE將其與其他測試用例一起運行時,is_displayed()返回FalseSelenium Webdriver測試元素可見性的假陰性結果?

我試過隱式和顯式等待,但等待不是問題,並且元素已經加載。

下面是測試案例在我的測試腳本:

def test_image_element_icon_is_displayed(self): 
    self.assertTrue(self.driver.find_element_by_css_selector("#Image").is_displayed(),msg="Image is not displayed") 

這是我的腳本在運行CLI:

driver.find_element_by_css_selector("#Image").is_displayed() 

有什麼辦法,我可以防止這種假陰性?也許改變我目前使用的元素選擇器?

這裏是我的圖片元素的HTML:

<div ng-click="applyDataElement(toolbarButton.type, toolbarButton.id)" class="frame-click ng-scope" ng-repeat="toolbarButton in toolbar"> 
       <div class="frame-box" ng-attr-id="{{toolbarButton.id}}" id="Image"> 
        <div class="draggable-box"> 
         <div bind-html-unsafe="toolbarButton.icon" class="draggable-icon ng-binding"><i class="fa fa-picture-o"></i></div> 
         <div class="draggable-label ng-binding">Image</div> 
        </div> 
       </div> 
      </div> 
+0

你能提供的元素的某些'html'? – Saifur 2015-04-05 22:31:47

+0

這裏的目的是什麼?帶文字的'div'*圖片*?或具有ID *圖像*的'div'? – Saifur 2015-04-05 22:38:48

+0

@Saifur與圖像編號 – Mahmor 2015-04-05 22:43:01

回答

4

我敢肯定,這個ID不能獨特因爲它在ng-repeat,它可能會加載多個相同ID的元素,即而不是可以安全使用。

由於這樣說和既然,你也提到元素負載不是一個問題,它可以安全地假設選擇器可能返回實際上隱藏的其他元素。在硒實際上發現了隱藏的元素並且不是預期元素之前,我經歷了類似的事情。您實際上可以使用len()find_elements_by_css_selector()來查看返回了多少個元素。

使用ng-attr-id="{{toolbarButton.id}}"或客戶端上的任何顯示cojuntion與[id='image'][ng-attr-id='something']爲cssSelector

+0

謝謝,我使用了Image元素的整個CSS,它工作正常。但是,我需要找到一種方法來找到一個較短的唯一屬性來查找不是長css的元素。 @Saifur – Mahmor 2015-04-05 22:54:35

+1

@MahsaMortazavi你可以。除非你需要一些漂亮的代碼,否則我通常不會像長xpath一樣擔心長css。我不知道長時間的CSS會不會嚴重影響執行時間 – Saifur 2015-04-05 22:56:22

+0

這是一個不錯的更新:) – alecxe 2015-05-27 06:23:43

3

在Python終端運行的代碼並運行它作爲腳本之間的主要區別是,在終端你擁有的每行之間的暫停/延遲你執行 - 這給頁面的時間來處理異步請求,更新DOM等。在你的測試代碼,你需要等待元素變得可見

from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions as EC 


wait = WebDriverWait(driver, 10) 
image = wait.until(EC.visibility_of_element_located((By.ID, "Image"))) 
+0

感謝@alecxe,這是真的。我之前有這個問題。但是在這種情況下,該元素已加載,但#Image不是唯一的選擇器。 – Mahmor 2015-04-05 22:56:00

+0

@MahsaMortazavi當然,這是有道理的。感謝分享。 – alecxe 2015-04-05 22:57:31

相關問題