2012-07-18 57 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

相关问题