我对硒的隐含等待有疑问?我们知道隐式等待是动态等待,这意味着如果我们提到等待 10 秒以加载任何元素,但如果元素在 4 秒内加载,则驱动程序退出等待。
所以,问题是驱动程序如何知道元素在 4 秒内加载并让我们从等待中出来?我们没有提到隐式等待中的任何条件,例如查找任何元素的可见性然后出来,那么隐式等待究竟是如何调用来退出等待的?
我对硒的隐含等待有疑问?我们知道隐式等待是动态等待,这意味着如果我们提到等待 10 秒以加载任何元素,但如果元素在 4 秒内加载,则驱动程序退出等待。
所以,问题是驱动程序如何知道元素在 4 秒内加载并让我们从等待中出来?我们没有提到隐式等待中的任何条件,例如查找任何元素的可见性然后出来,那么隐式等待究竟是如何调用来退出等待的?
无法使用Selenium动态处理隐式等待。在他的史诗评论中,Jim Evans [Maintainer - DotNet client / IEDriverServer] 提到,implicitlyWaits通常(总是可能不会)在WebDriver系统remote
一侧实现。这意味着ImplicitWait包含在WebDriver变体中,即GeckoDriver、IEDriverServer、ChromeDriver、安装到匿名 Firefox 配置文件 ( Selenium RC ) 中的WebDriver Firefox 扩展和 Java 远程 WebDriver 服务器 (selenium-server-standalone.jar)。
一旦你设置了implicitly_wait,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);
隐式等待发生在驱动程序级别,显式等待发生在编程级别。大多数人都没有意识到这一点。
隐式等待仅检查它是否存在,因此您不必像显式等待那样指定任何条件。但是我已经提出了在 Chrome 中包含隐式等待可见性的票(请参见此处https://bugs.chromium.org/p/chromedriver/issues/detail?id=2016)和 Firefox,Chrome 已经合并了该更改但火狐还没有。我要求他们包含它,因为 Firefox Legacy 驱动程序等待元素的存在和可见性,所以我希望在这里也一样。