2012-07-18 21 views
0

我有一塊div,你可以點擊顯示手風琴風格的內容。可以在XPath定位器上使用CSS屬性以確保元素可見嗎?

我正在通過selenium的這個模塊來打開它們,然後最終獲取屏幕截圖。然而,我不確定如何最好地檢查手風琴項目已經顯示,然後再進入下一個。

目前我的測試運行通過,但最終的屏幕截圖顯示一些項目仍然關閉。我的代碼:

detailsAccordion = self.ff.find_elements_by_class_name('accordion') 
index = 1 
for option in detailsAccordion: 
    try: 
     WebDriverWait(self.ff, 10).until(lambda driver : driver.find_element_by_xpath("//div[@class='accordionContainer']/div["+ 
      str(index) +"]/h3[1]")).click() 
     # Need a WebDriverWait here for style='display: block;' on the current div 
    except: 
     print "Can't access div #" + unicode(index) 
    index = index + 1 

如果我添加一行像;

WebDriverWait(self.ff, 10).until(lambda driver : driver.find_element("//div[@class='accordionContainer']/div["+ 
       str(index) +"][@style='display: block;']")) 

我得到我的異常打印,所以有可能在每個div的顯示屬性上添加一個要求嗎?

回答

1

通過使用由selenium API提供的is_displayed()方法,您可以檢查是否有任何WebElement可見。

當您通過網頁上的xpath查找元素時,selenium驅動程序會自動等待頁面加載,然後將控制權移交給您的代碼。我沒有看到需要使用WebDriverWait。

如果元素不存在,代碼會給元素找不到異常,但如果存在is_displayed()將根據是否可見返回true或false。

在拍攝屏幕截圖之前,檢查手風琴項目是否可見,如果可見則截取屏幕截圖。

也許使用implicitWait將幫助您 -

from selenium import webdriver 

    ff = webdriver.Firefox() 
    ff.implicitly_wait(10) # seconds 
+0

我試過以下,但它不會等待每個項目打開。有些失敗,但有一個時間睡眠(1),他們都工作。 'WebDriverWait(self.ff,10).until(lambda driver:driver.find_element_by_xpath(「// div [@ class ='accordionContainer']/div [」+ str(index)+「]/div [@ class =' accordionContent']「)。is_displayed())' – 2012-07-18 10:07:55

+0

一個隱含的等待會起作用,但這與我試圖避免的睡眠有效地相同。我寧願webdriver可以看到div的CSS屬性已經設置爲顯示:塊來提高腳本的速度。 – 2012-07-19 09:16:17

+1

10秒的隱含等待並不意味着驅動程序將每次等待10秒來加載頁面。這意味着如果司機沒有找到你正在尋找的元素,那麼它將等待10秒。因此,您不會因使用隱式等待而失去時間。 – 2012-07-19 16:56:46

相關問題