Почему мое явное ожидание не работает в Selenium .Net? - PullRequest
0 голосов
/ 04 ноября 2019

Я написал метод расширения C #, который принимает By для элемента и пытается подождать до 5 секунд при повторном опросе страницы, чтобы увидеть, присутствует ли элемент.

Воткод:

public static IWebElement FindWithWait(this ISearchContext context, By by)
{
    var wait = new DefaultWait<ISearchContext>(context)
    {
        Timeout = TimeSpan.FromSeconds(5)
    };
    wait.IgnoreExceptionTypes(typeof(NoSuchElementException));
    return wait.Until(ctx =>
    {
        Console.WriteLine($"{DateTimeOffset.Now} wait is trying...");
        return ctx.FindElement(by);
    });
}

Для целей этого вопроса, вот как я вызываю метод:

    Console.WriteLine($"{DateTimeOffset.Now} before");
    try 
    {
        var element = driver.FindWithWait(By.Id("not_in_page"));
    }
    catch (Exception ex) 
    { 
        Console.WriteLine($"{DateTimeOffset.Now} exception:" + ex);
    }  
    Console.WriteLine($"{DateTimeOffset.Now} after");

Учитывая, что элемент с идентификатором #not_in_page не существует на странице ичто время опроса по умолчанию для метода Until() составляет 500 миллисекунд, я ожидал бы, что код выведет что-то вроде:

11/4/2019 11:20:00 AM +02:00 before
11/4/2019 11:20:00 AM +02:00 wait is trying...
11/4/2019 11:20:01 AM +02:00 wait is trying...
11/4/2019 11:20:01 AM +02:00 wait is trying...
11/4/2019 11:20:02 AM +02:00 wait is trying...
11/4/2019 11:20:02 AM +02:00 wait is trying...
11/4/2019 11:20:03 AM +02:00 wait is trying...
11/4/2019 11:20:03 AM +02:00 wait is trying...
11/4/2019 11:20:04 AM +02:00 wait is trying...
11/4/2019 11:20:04 AM +02:00 wait is trying...
11/4/2019 11:20:05 AM +02:00 wait is trying...
11/4/2019 11:20:05 AM +02:00 after

Однако на самом деле я получаю:

11/4/2019 11:20:00 AM +02:00 before
11/4/2019 11:20:00 AM +02:00 wait is trying...
11/4/2019 11:21:00 AM +02:00 exception: OpenQA.Selenium.WebDriverException: The HTTP request to the remote WebDriver server for URL ######### timed out after 50 seconds. ---> #########
11/4/2019 11:21:00 AM +02:00 after

Обратите внимание, что опрос, кажется, происходит только один раз, и исключение было выдано через 60 секунд после начала опроса.

Не подлежит ли wait.Until() неявное ожидание 60 секунд? Как я могу вместо этого заставить его игнорировать и опрашивать один раз каждые 500 миллисекунд?

1 Ответ

0 голосов
/ 04 ноября 2019

О, брат. Я понял, что происходит сразу после подачи вопроса.

Причина, по которой сообщение waiting... печатается только один раз, а исключение выдается через 60 секунд, заключается в том, что где-то ранее в моем коде неявное ожидание было установлено равным 60 секундам. Удалив это, код работал как ожидалось.

Решение сделать явный опрос ожидания каждые 500 миллисекунд, как и ожидалось, состоит в том, чтобы никогда не устанавливать неявное ожидание использования драйвера.

Альтернативный подход слишком неприятен для меня: я мог бы попытаться перехватить неявное значение ожидания в начале моего метода расширения, затем установить его в 0 и опросить и, наконец, сбросить его до захваченного значения.

Итог - Плохая идея смешивать неявные и явные ожидания для данного экземпляра драйвера .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...