Я написал метод расширения 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 миллисекунд?