【问题标题】:Using implicit wait in selenium在 selenium 中使用隐式等待
【发布时间】:2018-01-22 04:25:42
【问题描述】:

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

【问题讨论】:

标签: selenium selenium-webdriver selenium-chromedriver geckodriver implicitwait


【解决方案1】:

隐式等待

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

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

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

  • Python

    driver.implicitly_wait(10)
    
  • Java

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

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

最后,一旦您设置了 ImplicitWaitWebDriver 实例(即 驱动程序)就能够在其生命周期内执行此配置。但是,如果您需要将 WebDriver 实例(即 driver 的粗略时间更改为 wait,则可以按如下方式重新配置它:

  • Python

    driver.implicitly_wait(5)
    
  • Java

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

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

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

  • Python

    driver.implicitly_wait(0)
    
  • Java

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

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

回答您的问题

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

【讨论】:

  • 根据 selenium WebDriver documentation,无法重新配置隐式等待:“一旦设置,隐式等待将设置为 WebDriver 对象实例的生命周期。”
  • @Simon 这意味着一旦设置,它在驱动程序实例的生命周期内不会改变。如果您更改它,它可以更改。你可以自己测试一下……它有效。您基本上可以通过将其设置为 0 来关闭隐式等待,然后通过将其设置为某个非零值来“重新打开它”。
【解决方案2】:

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

【讨论】:

  • 你说它对所有元素都有效,它是否也适用于加载URL等操作?而且我想我必须对需要查找的每个元素使用显式等待,因为它是基于条件的。
  • 没有直接的方法来为每个元素执行此操作,您可以编写自己的函数i.e. click();,它可以做两件事。 1. 明确等待特定条件和 2. click()
  • 假设我试图通过在单个 try 块或函数中的显式等待来查找多个元素,写一次就够了吗?当我在写其他函数/尝试块时会出现什么情况?
  • 怎么说呢,这要看你在那个函数里写了什么。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2018-01-24
    相关资源
    最近更新 更多