当前位置: 首页 > 面试题库 >

webdriver等待多个元素之一出现

咸亦
2023-03-14
问题内容

是否有办法让a webDriverWait等待许多元素之一出现并根据哪个元素出现而采取相应的行动?

目前,我WebDriverWait在try循环中执行了一个操作,如果发生超时异常,我将运行备用代码,等待其他元素出现。这看起来很笨拙。有没有更好的办法?这是我的(笨拙的)代码:

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)

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


问题答案:

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


 类似资料:
  • 问题内容: 我正在寻找类似于在单击元素之前检查元素是否已显示的内容。我认为可以通过完成此操作,因此我使用了以下方法: 然后点击 不幸的是,有时它等待元素,有时不等待。我寻找了一段时间,找到了这个解决方案: 它等待一切正常,但是在超时之前必须等待10次5、50秒。有点多。因此,我将隐式等待时间设置为1秒,直到现在一切都还不错。因为现在有些事情在超时前等待10秒,而另一些事情在1秒之后超时。 如何覆盖

  • 问题内容: 只要我使用PageObject模式,我就想知道应该在哪里等待动态页面上的元素。假设我们有测试方法和pageObject类。我应该做类似的事情吗(在测试方法中): 点击按钮 等待元素显示 验证元素(例如包含方法isElementDisplayed()) 也许还有其他好的做法来等待该要素?也许我们应该等待PageObject.class中的isElementDisplayed方法中的元素?

  • 等待元素出现在网页上的最佳方式是什么?我已经读到,我们可以使用隐式等待和功能,如网络驱动程序wait,流利的等待等,最后但不是最不重要的线程.sleep()...我使用最多,但想停止使用。 我的场景: 用户登录到网站…网站检查凭据,并以叠加的形式向用户提供报价(一种弹出窗口,但不是单独的窗口)。我需要验证叠加图上的文字。用户登录和显示覆盖之间存在时间间隔。最好的方法是什么,以便硒只等待元素不可见的

  • 它一直在等待,但在超时之前,它必须等待10乘以5,50秒。有点多。所以我将隐含的等待设置为1秒,直到现在看起来一切都很好。因为现在有些事情在超时前等待10秒,但有些事情在1秒后超时。 如何在代码中覆盖等待元素的存在/可见性?任何暗示都是可以察觉的。

  • 问题内容: 我想知道是否可以告诉puppeteer等到显示的元素。 我有什么办法可以做到这一点? 问题答案: 我认为您可以为此使用功能。 要检查可用选项,请参阅github链接。

  • 问题内容: 等待和一起出现很方便。 问题是, 如果 找到元素的唯一可能方法 是 什么,因为它没有id,没有名称,没有唯一的类? 的构造函数仅接受作为参数,而不接受。 我已经设定了时间,所以使用它似乎不是一个好主意,因为我不想为这个元素等待那么长时间。 这是场景: 有一个网页,其中包含许多标签。每个标签都有格式要求。 当不满足格式要求时,动态标签将出现在该标签之后。 由于标签太多,因此我创建了一个通