WebDriverWait在使用两者时是否会覆盖ImplicitlyWait?

时间:2013-07-24 09:04:26

标签: python selenium webdriver

我使用python + selenium webdriver进行自动化。我已经使用了ImplicitlyWait和WebDriverWait。

问题:

  1. 在单个脚本中同时使用ImplicitlyWait和WebDriverWait是一个好习惯吗?

  2. 假设我的ImplicitlyWait值为20,WebDriverWait值为10秒。 WebDriverWait在等待特定元素时会覆盖20吗?当ImplicitlyWait值小于WebDriverWait时会发生什么?

  3. 请建议。我试着在互联网上找到这个答案,但没有得到任何完整的证据或令人信服的答案。

1 个答案:

答案 0 :(得分:4)

首先,它可能是个人选择。我根本不使用implicit waiting因为我喜欢控制Selenium在哪里等待以及它不在哪里。设置implicit wait是盲目告诉Selenium,如果你找不到我的元素,那么等待一段时间直到你可以。不论它是什么,无论结果如何,无论在哪一页,你都要等到你找到它或者20秒过去了。

如果这是你想要的方式,那很好,但对我来说,问题来自于如果我的元素在页面上显示30秒,那么无论如何这本身就是一个问题。 Selenium只是隐藏它,它可以解决问题。

然而,有些时候元素确实需要一段时间才能显示并且“准备就绪”,而explicit waiting就会出现。当你期待它时。

至于等待,将会发生什么事情,当你的WebDriverWait被击中时,它会运行并尝试找到该元素。 Selenium会看到你设置了implicit wait,所以它会不断尝试找到该元素长达20秒。

它将在幕后“免费”执行此操作。

一旦过期,您的WebDriverWait会收到回复,并且由于您的implicit wait超时大于WebDriverWait超时,它会因异常而超时(超时异常)。< / p>

如果WebDriverWait值高于implicit wait值(您在评论中的示例),那么过程将是:

  1. 最初运行WebDriverWait
  2. 点击.FindElement来电
  3. Selenium在内部运行10秒钟
  4. 在最初的10秒后,您的WebDriverWait会收到回复。
  5. 如果找不到该元素,则会再次从步骤1开始运行。
  6. 一旦进入第4步,如果仍未找到该元素,它现在将抛出超时异常。
  7. 进一步解释(伪C#代码):

    driver.Manage().Timeouts().SetImplicitWait(TimeSpan.FromSeconds(10));
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
    wait.Until(w => 
    {
        return w.FindElement(By.Id("something")).Displayed;
    }
    

    我们的WebDriverWait为20秒,implicit wait为10秒。

    它会命中:

    return w.FindElement(By.Id("something")).Displayed;
    

    第一次。内部的Selenium将运行.FindElement 10秒钟。在这10秒过后,我的WebDriverWait将检查它的状况(.Displayed)。如果不满足,那么WebDriverWait将再次运行相同的代码行。再次,Selenium将像以前一样,并运行10秒。一旦它从那里回来,如果条件不满足,则意味着,WebDriverWait等待的时间总共为20秒,然后会抛出错误。