【问题标题】:webdriver wait for one of a multiple elements to appearwebdriver 等待多个元素之一出现
【发布时间】:2012-07-18 11:09:18
【问题描述】:

有没有办法让webDriverWait 等待多个元素之一出现并根据出现的元素采取相应的行动?

目前,我在 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)

有人有任何建议以更有效的方式完成此任务吗?

【问题讨论】:

    标签: python selenium webdriver selenium-webdriver wait


    【解决方案1】:

    创建一个函数,将标识符映射到 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 ...
    

    【讨论】:

      【解决方案2】:

      类似的东西:

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

      【讨论】:

      • is_element_present 是一个 selenium rc 方法。这里主要是确定采用了哪些“或语句”路径,以便返回值可以告诉运行哪些代码
      猜你喜欢
      • 1970-01-01
      • 2013-08-06
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 2022-12-10
      • 2013-09-21
      • 2012-07-28
      相关资源
      最近更新 更多