在 selenium 中使用隐式等待

Using implicit wait in selenium

我是初学者。我明白等待基本上是做什么的,但我对互联网上不同的教程如何放置和解释它感到困惑。例如,在下面的代码中,它被放置在加载 URL 之前。那么,它只是等待加载 URL 还是等待找到元素或两者兼而有之?如果我在 try 块中使用一次隐式等待,它是否适用于我在代码中执行的每个元素搜索,这是真的吗?

from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")

是的,implicit_wait 是全球适用的。所以一旦你设置它就会应用于所有元素。

除非您的应用程序太慢,否则我不建议使用 implicit_wait。您可以根据下一页的要求使用 explicit wait 或任何其他等待。

它是一个 JAVADOC,但 python 的实现也应该相同。

https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html#implicitlyWait-long-java.util.concurrent.TimeUnit-

隐式等待

ImplicitWait as per the Java Docs is to specify the amount of time the WebDriver instance i.e. the driver should wait when searching for an element if it is not immediately present in the HTML DOM 纳秒, 微秒, 毫秒, SECONDSMINUTESHOURSDAYS 时尝试如果元素不是立即可用的,则查找一个或多个元素。默认设置是 0,这意味着 driver 当找到一个或多个元素的指令时,搜索开始并且结果立即可用。

在这种情况下,在重新加载网页后,立即搜索可能会/可能不会找到一个或多个元素。因此,您的 Automation Framework 可能面临以下任何异常情况:

因此我们引入ImplicitWait。通过引入 ImplicitWait驱动程序 将轮询 DOM Tree until the element has been found for the configured amount of time looking out for the element or elements before throwing a NoSuchElementException。到那时,您一直在寻找的一个或多个元素可能会在 HTML DOM 中可用。在您的代码中,您已经将 ImplicitWait 设置为 10 秒的值,driver 将轮询HTML DOM 10 秒。

  • Python:

    driver.implicitly_wait(10)
    
  • Java:

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    
  • DotNet:

    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
    

最后,一旦你设置了 ImplicitWait 实例,即 driver 就能够执行这个配置直到它的生命周期。但是,如果您需要更改 WebDriver 实例的粗略时间,即 driverwait 然后您可以按如下方式重新配置它:

  • Python:

    driver.implicitly_wait(5)
    
  • Java:

    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    
  • DotNet:

    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
    

如果您想在任何时候取消 ImplicitWait 您可以按如下方式重新配置它:

  • Python:

    driver.implicitly_wait(0)
    
  • Java:

    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
    
  • DotNet:

    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(0);
    

回答您的问题

  • ...等待 URL... :不,ImplicitWait 对页面加载没有影响。
  • ...用于查找元素...:是的,ImplicitWait 将定义时间的粗略 WebDriver 实例将等待查找一个或多个元素。
  • ...Implicit wait once... : 是的,只需要配置一次ImplicitWait,并且全程适用WebDriver 实例的生命周期。
  • ...Every element search... :是的,适用于调用 findElement()findElements() 时。

隐式等待适用于所有 Web 元素,而显式等待仅适用于指定的元素。

显式等待更智能,真正用于处理 Ajax 另一方面,隐式等待通常用于处理应用程序同步问题。