Aclaración de la causa de la mezcla esperas implícitas y explícitas de Selenium doc

Estaba leyendo la documentación de SeleniumHQ y encontré las siguientes declaraciones.

“ADVERTENCIA: no mezcle esperas implícitas y explícitas. Hacer esto puede ocasionar tiempos de espera impredecibles. Por ejemplo, establecer una espera implícita de 10 segundos y una espera explícita de 15 segundos podría causar un tiempo de espera después de 20 segundos”.

Por alguna razón, no puedo hacer que esto tenga sentido. El tiempo de espera total 20s es el principal punto de confusión para mí. ¿Alguien puede explicar si me falta algo?

EDITAR

Mi pregunta no es acerca de la implementación / consecuencias de mezclar esas esperas. Se trata completamente de las declaraciones y el cálculo del tiempo de espera en el documento.

2nd Edit

Parece que el documento es correcto de acuerdo con las pruebas a continuación. Aún así necesito la explicación .

Sólo espera implícita

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(); } } } 

Tiempo en segundo: 00: 00: 10.0167290

Sólo espera explícita

 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(); } } } 

Tiempo en segundo: 00: 00: 15.2463079

Mixto, Explícito e Implícito ambos

 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(); } } } 

Tiempo en segundo: 00: 00: 20.5771817

Mi pregunta no es sobre la implementación de esas esperas. Se trata completamente de las declaraciones y el cálculo del tiempo de espera en el documento.

Pero debes saber cómo se implementan para dar sentido a lo que está sucediendo. Esto es lo que sucede con su mezcla de los dos tipos de esperas. Estoy superando esos pasos que no son importantes para la discusión.

  1. Su secuencia de comandos establece una espera implícita.

  2. Su secuencia de comandos inicia una espera explícita comprobando si el elemento existe. La espera explícita funciona por sondeo . Por lo tanto, envía un comando al navegador para verificar la existencia del elemento.

  3. Debido a la espera implícita ya establecida, el comando enviado al navegador tarda 10 segundos en devolver una falla.

  4. Su espera explícita verifica si ha alcanzado su límite de tiempo, que es de 15 segundos. Actualmente está en 10s (más una pequeña cantidad de tiempo necesaria para ejecutar el script, latencia de red, etc.) en la espera, que es menos de 15 segundos. Por lo tanto, no se hace esperar y vuelve a emitir el mismo comando que en el paso 2 anterior.

  5. Debido a la espera implícita, el comando enviado al navegador tarda 10 segundos en devolver una falla.

  6. Cuando la espera explícita comprueba nuevamente su propio tiempo de espera, han transcurrido más de 15, por lo que se agota el tiempo de espera.

Entonces, la espera explícita sondea dos veces, y cada vez lleva 10 segundos, lo que significa 20 segundos en total (más una pequeña cantidad de tiempo para contabilizar la contabilidad).

Una espera explícita no hace nada para detectar y compensar una espera implícita que se ha establecido. Y no continúa ejecutándose en paralelo a los comandos que envía al navegador. Mientras se ejecuta un comando del navegador, la espera explícita no hace ninguna contabilidad o puede agotar el tiempo de espera. Tiene que esperar a que se complete el comando del navegador antes de verificar si se debe agotar el tiempo de espera.