1

我是初学者。我理解等待基本上是做什么的,但我对互联网上的不同教程如何放置和解释它感到困惑。例如,在下面的代码中,它被放置在加载 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")
4

3 回答 3

5

隐式等待

根据Java Docs的ImplicitWait是指定WebDriver实例的时间量,即驱动程序在搜索元素时应该等待的时间量,如果它不是立即出现在HTML DOM中的NANOSECONDSMICROSECONDSMILLISECONDSSECONDSMINUTES,尝试查找一个或多个元素(如果它们不是立即可用)时的HOURSDAYS 。默认设置为0,这意味着driver当找到查找一个或多个元素的指令时,搜索开始并且结果立即可用。

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

因此我们引入ImplicitWait。通过诱导ImplicitWait驱动程序将轮询DOM 树,直到在配置的时间内找到元素,然后在抛出NoSuchElementException之前查找元素。到那时,您一直在寻找的一个或多个元素可能在HTML DOM中可用。在您的代码中,您已经将ImplicitWait设置为10秒的值,驱动程序将轮询HTML DOM 10秒。

  • 蟒蛇

    driver.implicitly_wait(10)
    
  • 爪哇

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    
  • 点网

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

最后,一旦您设置了ImplicitWaitWebDriver实例(即驱动程序)就能够携带此配置直到其生命周期。但是,如果您需要更改WebDriver实例的粗略时间,即驱动程序等待,那么您可以重新配置它,如下所示:

  • 蟒蛇

    driver.implicitly_wait(5)
    
  • 爪哇

    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    
  • 点网

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

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

  • 蟒蛇

    driver.implicitly_wait(0)
    
  • 爪哇

    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
    
  • 点网

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

回答您的问题

  • ...等待 URL ...:不,ImplicitWait对页面加载没有影响。
  • ...对于查找元素...:是的,ImplicitWait将定义WebDriver实例等待查找元素的粗略时间。
  • ...隐式等待一次...:是的,您只需要配置一次ImplicitWait ,它适用于WebDriver实例的整个生命周期。
  • ...每个元素搜索...:是的,适用于任何时候findElement()findElements()被调用。
于 2017-08-14T12:36:52.083 回答
1

是的,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-

于 2017-08-14T10:48:51.617 回答
1

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

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

于 2017-08-14T13:12:31.197 回答