Подтвердить что ты не робот

Уточнение причины смешивания Неявные и явные ожидания документа 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

4b9b3361

Ответ 1

Мой вопрос не в реализации этих ожиданий. Это полностью касается утверждений и расчета тайм-аута в документе.

Но вы должны знать, как они реализованы, чтобы понять, что происходит. Вот что происходит с вашим сочетанием двух типов ожиданий. Я выполняю те шаги, которые не важны для обсуждения.

  • Ваш script устанавливает неявное ожидание.

  • Ваш script запускает явное ожидание проверки существования элемента. Явное ожидание работает путем опроса. Поэтому он отправляет команду браузеру для проверки существования элемента.

  • Из-за неявного ожидания, уже установленного, команда, отправленная в браузер, занимает 10 секунд, чтобы вернуть сбой.

  • Ваше явное ожидание проверяет, достиг ли он своего временного предела, равного 15 с. В настоящее время он составляет 10 с (+ крошечное количество времени, затрачиваемого на выполнение script, латентность сети и т.д.) В ожидании, которое составляет менее 15 секунд. Таким образом, это не выполняется в ожидании и переиздает ту же команду, что и на шаге 2 выше.

  • Из-за неявного ожидания команда, отправленная в браузер, занимает 10 секунд, чтобы вернуть сбой.

  • Когда явное ожидание снова проверяет свой собственный тайм-аут, прошло более 15 секунд, поэтому время истекает.

Таким образом, явные ожидания проверяются дважды, и каждый раз занимает 10 секунд, что означает 20 секунд (плюс крошечное количество времени для учета бухгалтерского учета).

Явное ожидание не делает ничего, чтобы обнаружить и компенсировать неявное ожидание, которое было установлено. И он не продолжает работать параллельно с командами, которые он отправляет в браузер. В то время как выполняется команда браузера, явное ожидание не делает никакой бухгалтерской отчетности или не может тайм-аут. Он должен дождаться завершения команды браузера, прежде чем проверять, должен ли он тайм-аут.