Хорошо, ваша проблема связана со смешением Explicit
и Implicit
Подождите.
Позвольте мне объяснить.
Implicit
wait приводит к тому, что действия Selenium, например Click
или SendKeys
, ожидают определенное время. Например, 300 секунд.
public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
{
if (timeoutInSeconds > 0)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
return wait.Until(drv => drv.FindElement(by));
}
return driver.FindElement(by);
}
Учитывая ваш код, строка
return wait.Until(drv => drv.FindElement(by));
вызывает проблему.
wait.Until
запускается первым и пытается вызвать метод findElement
. Затем наступает Implicit
ожидание, и Selenium ждет 300 секунд, пока действие findElement
не будет выполнено. Explicit
wait не считает его 300 секунд. Смешивание обоих привело к непредсказуемым результатам согласно комментариям в библиотеке Selenium.
По моему опыту это выглядит так: псевдокод:
for (int i = 500ms; i < timeoutInSeconds; i+=500ms) {
Thread.Sleep(300*1000) //300 seconds
Driver.FindElement();
}
Вот как в основном это лечится. Неявное ожидание приводит к остановке потока, поэтому таймер в явном ожидании игнорируется для данного Thread.Sleep ();
В вашем случае вы использовали 15 секунд Explicit
ожидания и 300 секунд Implicit
ожидания.
Пул по умолчанию каждые 500 миллисекунд.
Как правило, ваше ожидание будет работать во время:
15 * 2 // сколько раз вызывается метод FindElement
Умножьте его на количество секунд в каждом неявном вызове ожидания из элемента поиска:
30 * 300 секунд. Это дает 9000, что дает 150 минут. Это более 2 часов.
Вот почему ваш код застрял, а время ожидания Selenium истекло.
Надеюсь, я вам все правильно объяснил.