Уточнение причины смешивания Неявные и явные ожидания документа Selenium
Я читал документацию SeleniumHQ и наткнулся на следующие утверждения.
"ПРЕДУПРЕЖДЕНИЕ: Не смешивайте неявные и явные ожидания. Это может привести к непредсказуемым временам ожидания. Например, установка неявного ожидания 10 секунд и явное ожидание 15 секунд может привести к возникновению таймаута через 20 секунд."
По какой-то причине я не могу понять, что это имеет смысл. Общий тайм-аут 20-го года является главной причиной для меня. Может ли кто-нибудь объяснить, если я что-то упустил?
ИЗМЕНИТЬ
Мой вопрос не о реализации/последствиях смешивания этих ожиданий. Это полностью касается утверждений и расчета тайм-аута в документе.
2nd Edit
Похоже, что документ соответствует приведенным ниже результатам. Мне все еще нужно объяснение, хотя.
Просто неявное ожидание
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
Ответы
Ответ 1
Мой вопрос не в реализации этих ожиданий. Это полностью касается утверждений и расчета тайм-аута в документе.
Но вы должны знать, как они реализованы, чтобы понять, что происходит. Вот что происходит с вашим сочетанием двух типов ожиданий. Я выполняю те шаги, которые не важны для обсуждения.
-
Ваш script устанавливает неявное ожидание.
-
Ваш script запускает явное ожидание проверки существования элемента. Явное ожидание работает путем опроса. Поэтому он отправляет команду браузеру для проверки существования элемента.
-
Из-за неявного ожидания, уже установленного, команда, отправленная в браузер, занимает 10 секунд, чтобы вернуть сбой.
-
Ваше явное ожидание проверяет, достиг ли он своего временного предела, равного 15 с. В настоящее время он составляет 10 с (+ крошечное количество времени, затрачиваемого на выполнение script, латентность сети и т.д.) В ожидании, которое составляет менее 15 секунд. Таким образом, это не выполняется в ожидании и переиздает ту же команду, что и на шаге 2 выше.
-
Из-за неявного ожидания команда, отправленная в браузер, занимает 10 секунд, чтобы вернуть сбой.
-
Когда явное ожидание снова проверяет свой собственный тайм-аут, прошло более 15 секунд, поэтому время истекает.
Таким образом, явные ожидания проверяются дважды, и каждый раз занимает 10 секунд, что означает 20 секунд (плюс крошечное количество времени для учета бухгалтерского учета).
Явное ожидание не делает ничего, чтобы обнаружить и компенсировать неявное ожидание, которое было установлено. И он не продолжает работать параллельно с командами, которые он отправляет в браузер. В то время как выполняется команда браузера, явное ожидание не делает никакой бухгалтерской отчетности или не может тайм-аут. Он должен дождаться завершения команды браузера, прежде чем проверять, должен ли он тайм-аут.