混合隐式和显式等待

时间:2013-11-28 14:16:29

标签: python selenium webdriver selenium-webdriver

docs说:

  

隐式等待是告诉WebDriver对DOM进行轮询   尝试查找一个或多个元素的时间量   没有立即可用。

子问题:

对于find_elements_by_(复数),在继续编写脚本之前,implicit_wait等待存在多少个元素?或者implicit_wait仅适用于find_element_by_(单数)?如果是这样,文档对“或元素”的意义是什么?

an SO answer我读到最好不要在同一个脚本中使用隐式和显式等待,我注意到这一点,因为我希望测试尽可能健壮。

因为我知道有时候我肯定需要WebDriverWait,这是否意味着我需要在我的implicit_wait unittest方法中删除setUp,而是聘用WebDriverWait我每次使用find_element_by_方法时都会{?}}

(我宁愿不必这样做;虽然我想我可以将每个find_element_by_方法放在我自己的自定义函数中 - 每个包裹在他们自己的WebDriverWait中 - 感觉就像我不应该)。

所以我的主要问题是:

我可以将implicit_wait保留在我的测试setUp方法中,然后只使用WebDriverWait find_elements_by_以及我知道我需要它的其他地方?

1 个答案:

答案 0 :(得分:2)

  

因为我知道有时候我肯定需要WebDriverWait,这是否意味着我需要在unittest setUp方法中摆脱implicit_wait,而是每次使用任何find_element_by_方法时都使用WebDriverWait?

是。正如您在链接到的问题中看到的那样,如果您使用这两种类型的等待,您将遇到不良行为。这不仅仅是理论上的。我亲身经历过这种行为,尝试调试它,找到你链接的问题,然后从我的测试套件中删除所有隐含的等待。

我开发了一个library来帮助设置显式等待(并做一些其他事情)。假设您已经有一个具有selenium web驱动程序的driver对象:

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也存在,所以你不必等待< / em>为它。例如。如果你想要从Selenium获得的元素的父元素,你可以parent = foo.find_element_by_xpath("..")

对于find_elements的行为,它会在确定返回结果后立即返回。这可能意味着只有在find_elements找到要返回的内容后才显示后面的元素时才会获得一个元素。