我正在阅读SeleniumHQ文档,并遇到以下声明。
“警告:不要混合使用隐式等待和显式等待。这样做可能会导致不可预知的等待时间。例如,将隐式等待设置为10s,将显式等待设置为15秒,则可能导致20秒后发生超时。”
由于某些原因,我无法理解这一点。对于我来说,总超时时间是20秒。谁能解释我是否缺少什么?
编辑
我的问题不是关于混合这些等待的实现/后果。 这完全与文档中的语句和超时计算有关。
第二次编辑
根据以下测试,看来该文档是正确的。 我仍然需要解释 。
using System; using System.Diagnostics; using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; namespace Test { [TestFixture] public class Test { private IWebDriver _webDriver; [Test] public void ExplicitVsImplicitWaitTest() { _webDriver = new ChromeDriver(); _webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10)); _webDriver.Navigate().GoToUrl("https://www.google.com/"); _webDriver.Manage().Window.Maximize(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); try { //new WebDriverWait(_webDriver, TimeSpan.FromSeconds(15)).Until( //ExpectedConditions.ElementExists(By.CssSelector("Should Fail"))); _webDriver.FindElement(By.CssSelector("Should Fail")); } catch ( NoSuchElementException exception) //catch ( OpenQA.Selenium.WebDriverTimeoutException) { stopwatch.Stop(); Console.WriteLine(stopwatch.Elapsed); } _webDriver.Quit(); } } }
时间以秒为单位:00:00:10.0167290
using System; using System.Diagnostics; using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Support.UI; namespace Test { [TestFixture] public class Test { private IWebDriver _webDriver; [Test] public void ExplicitVsImplicitWaitTest() { _webDriver = new ChromeDriver(); //_webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10)); _webDriver.Navigate().GoToUrl("https://www.google.com/"); _webDriver.Manage().Window.Maximize(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); try { new WebDriverWait(_webDriver, TimeSpan.FromSeconds(15)).Until( ExpectedConditions.ElementExists(By.CssSelector("Should Fail"))); _webDriver.FindElement(By.CssSelector("Should Fail")); } //catch ( NoSuchElementException exception) catch ( OpenQA.Selenium.WebDriverTimeoutException) { stopwatch.Stop(); Console.WriteLine(stopwatch.Elapsed); } _webDriver.Quit(); } } }
时间以秒为单位:00:00:15.2463079
using System; using System.Diagnostics; using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Support.UI; namespace Test { [TestFixture] public class Test { private IWebDriver _webDriver; [Test] public void ExplicitVsImplicitWaitTest() { _webDriver = new ChromeDriver(); _webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10)); _webDriver.Navigate().GoToUrl("https://www.google.com/"); _webDriver.Manage().Window.Maximize(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); try { new WebDriverWait(_webDriver, TimeSpan.FromSeconds(15)).Until( ExpectedConditions.ElementExists(By.CssSelector("Should Fail"))); _webDriver.FindElement(By.CssSelector("Should Fail")); } //catch ( NoSuchElementException exception) catch ( OpenQA.Selenium.WebDriverTimeoutException) { stopwatch.Stop(); Console.WriteLine(stopwatch.Elapsed); } _webDriver.Quit(); } } }
时间以秒为单位:00:00:20.5771817
我的问题与那些等待的执行无关。这完全与文档中的语句和超时计算有关。
但是您必须知道如何实现它们才能理解正在发生的事情。这是两种类型的等待混合使用时发生的情况。我正在跳过对讨论不重要的那些步骤。
您的脚本设置了一个隐式等待。
您的脚本会开始显式等待,以检查元素是否存在。显式等待 通过轮询进行 。因此,它将命令发送到浏览器以检查元素的存在。
由于已经设置了隐式等待,发送给浏览器的命令需要10秒钟才能返回失败。
您的显式等待将检查它是否已达到其15s的时间限制。当前等待时间为10秒(加上执行脚本,网络延迟等所需的时间极少),少于15秒。因此,它没有等待完成,而是重新发出与上述步骤2中相同的命令。
由于隐式等待,发送到浏览器的命令需要10秒钟才能返回失败。
当显式等待再次检查其自身的超时时,已经超过15秒,因此超时。
因此,显式等待将轮询两次,每次都需要10秒,这意味着总共需要20秒(加上很少的时间来记账)。
显式等待不执行任何操作来检测和补偿已设置的隐式等待。而且,它不会继续与发送给浏览器的命令并行运行。在执行浏览器命令时,显式等待不会执行任何簿记操作或无法超时。它必须等待浏览器命令完成才能检查它是否应该超时。