2012-07-18 24 views
10

有没有办法让webDriverWait等待多个元素之一出现,并根据哪个元素出现相应的行为?webdriver等待多个元素之一出现

此刻我在一个try循环中做了一个WebDriverWait,如果发生超时异常,我运行等待其他元素出现的替代代码。这看起来很笨拙。有没有更好的办法?这里是我的(笨拙)代码:

try: 
    self.waitForElement("//a[contains(text(), '%s')]" % mime) 
    do stuff .... 
except TimeoutException: 
    self.waitForElement("//li[contains(text(), 'That file already exists')]") 
    do other stuff ... 

它涉及到等待一个完整的10单位为秒,查看是否该文件已经存在系统上的消息之前。

功能waitForElement只是做了一些WebDriverWait呼叫,像这样:

def waitForElement(self, xPathLocator, untilElementAppears=True): 
    self.log.debug("Waiting for element located by:\n%s\nwhen untilElementAppears is set to %s" % (xPathLocator,untilElementAppears)) 
    if untilElementAppears: 
     if xPathLocator.startswith("//title"): 
      WebDriverWait(self.driver, 10).until(lambda driver : self.driver.find_element_by_xpath(xPathLocator)) 
     else: 
      WebDriverWait(self.driver, 10).until(lambda driver : self.driver.find_element_by_xpath(xPathLocator).is_displayed()) 
    else: 
     WebDriverWait(self.driver, 10).until(lambda driver : len(self.driver.find_elements_by_xpath(xPathLocator))==0) 

任何人有任何建议,以更有效的方式做到这一点?

回答

7

创建一个函数,地图上的标识符来XPath查询并返回被匹配的标识符。

def wait_for_one(self, elements): 
    self.waitForElement("|".join(elements.values()) 
    for (key, value) in elements.iteritems(): 
     try: 
      self.driver.find_element_by_xpath(value) 
     except NoSuchElementException: 
      pass 
     else: 
      return key 

def othermethod(self): 

    found = self.wait_for_one({ 
     "mime": "//a[contains(text(), '%s')]", 
     "exists_error": "//li[contains(text(), 'That file already exists')]" 
    }) 

    if found == 'mime': 
     do stuff ... 
    elif found == 'exists_error': 
     do other stuff ... 
+0

谢谢。这会工作。 – amadain 2012-07-27 06:41:54

1

类似的东西:

def wait_for_one(self, xpath0, xpath1): 
    self.waitForElement("%s|%s" % (xpath0, xpath1)) 
    return int(self.selenium.is_element_present(xpath1)) 
+0

is_element_present是一个硒rc方法。这里主要的是确定哪个'或语句'路径被采用,以便返回的值可以告诉哪个代码运行 – amadain 2012-07-24 11:36:19

相关问题