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

我正在使用python selenium webdriver进行自动化.我已经使用了ImplicitlyWait和WebDriverWait.

问题:

>在单个脚本中同时使用ImplicitlyWait和WebDriverWait是一种好习惯吗?
>假设我的ImplicitlyWait值为20,WebDriverWait值为10秒. WebDriverWait在等待特定元素时会覆盖20吗?当ImplicitlyWait值小于WebDriverWait时会发生什么?

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

最佳答案
对于第一点,它可能是个人选择.我根本不使用隐式等待,因为我喜欢控制Selenium在哪里等待以及它不在哪里.设置隐式等待是盲目告诉Selenium,如果你找不到我的元素,那么等待一段时间直到你可以.无论它是什么,无论结果如何,无论在哪个页面,你都要等到你找到它或者20秒过去了.

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

但是,有些时候元素确实需要一段时间才能显示并且“准备好”,而且当显式等待时,它就会出现.当你期望它时.

至于等待,最初会发生什么事情,当你的WebDriverWait被击中时,它会运行并尝试找到该元素. Selenium会看到你有隐含的等待设置,所以它会不断尝试找到该元素长达20秒.

它会在幕后“免费”完成.

一旦过期,您的WebDriverWait将获得响应,并且由于您的隐式等待超时大于WebDriverWait超时,它将因异常(超时异常)而失败.

就WebDriverWait值是否高于隐式等待值(您在注释中的示例)而言,该过程将是:

>最初运行WebDriverWait
>它命中.FindElement调用
> Selenium在内部运行10秒钟
>在最初的10秒后,您的WebDriverWait会收到回复.
>如果未找到该元素,则再次从步骤1开始运行.
>一旦进入第4步,如果仍未找到该元素,它现在将抛出超时异常.

进一步解释(伪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秒,隐含等待时间为10秒.

它会命中:

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

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

相关文章

Python中的函数(二) 在上一篇文章中提到了Python中函数的定...
Python中的字符串 可能大多数人在学习C语言的时候,最先接触...
Python 面向对象编程(一) 虽然Python是解释性语言,但是它...
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定...
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非...
在windows下如何快速搭建web.py开发框架 用Python进行web开发...