一尘不染

混合隐式和显式等待

selenium

文件说:

隐式等待是告诉WebDriver在尝试查找一个或多个元素(如果不是立即可用)时轮询DOM一定时间。

子问题:

对于find_elements_by_(复数),implicit_wait在继续执行脚本之前需要等待多少个元素存在?还是implicit_wait仅适用于find_element_by_(单数)?如果是这样,文档中“或元素”是什么意思?

从一个SO答案中,我读到最好不要在同一脚本中同时使用隐式和显式等待,这是我注意到的,因为我希望测试尽可能强大。

既然我知道有些时候我肯定会需要WebDriverWait,这是否意味着我需要摆脱implicit_wait我的unittest
setUp方法,而WebDriverWait每次使用任何find_element_by_方法时都要雇用它?

(我宁愿不必这样做;尽管我想我可以将每个find_element_by_方法放在自己的自定义函数中-
每个方法都包装在自己的函数中WebDriverWait-感觉我不必这样做)。

所以我的主要问题是:

我是否可以保留我implicit_wait的测试setUp方法,然后仅WebDriverWait在涉及find_elements_by_我需要的其他地方使用它?


阅读 326

收藏
2020-06-26

共1个答案

一尘不染

既然我知道有时候我肯定会需要WebDriverWait,这是否意味着我需要在我的unittest
setUp方法中摆脱隐式等待,而每次使用任何find_element_by_方法时都要使用WebDriverWait吗?

是。正如您在链接到的问题中所看到的那样,如果您同时使用两种类型的等待,则会遇到不良行为。这不只是理论上的。我亲身经历了这种行为,尝试对其进行调试,找到您链接的问题,然后从我的测试套件中删除了所有隐式等待。

我开发了一个来帮助设置显式等待(并执行其他操作)。假设您已经有一个driver具有硒Web驱动程序的对象:

from selenium.webdriver.common.by import By
import selenic.util

util = selenic.util.Util(driver)

# This goes through util and uses the explicit wait set by util.
foo = util.find_element((By.CSS_SELECTOR, "..."))

# For special cases that take longer to give results.
with util.local_timeout(10):
    # The timeout is set to 10 for calls in this with block.
    bar = util.find_element(...)
# The timeout is restored to what it was just before the with.

在某些情况下,根本不需要使用等待,因为 从逻辑上讲, 如果元素A存在,那么元素B也存在,因此您不必 等待
。例如。如果您希望已经从Selenium获得的元素的父元素,可以执行parent = foo.find_element_by_xpath("..")

至于的行为find_elements,它会在确定有结果要返回时立即返回。这可能意味着如果以后的元素在find_elements找到返回的内容后才出现,则只会得到一个元素。

2020-06-26