Объединение неявного ожидания и явного ожидания вместе приводит к неожиданному времени ожидания
Мои два сценария -
1) Первый
@driver.manage.timeouts.implicit_wait = 30
@wait = Selenium::WebDriver::Wait.new(:timeout => 45) # Time greater than implicit
@wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")}
Что дает водителю 45 секунд на поиск текста (что ожидается)
2) Второй
@driver.manage.timeouts.implicit_wait = 30
@wait = Selenium::WebDriver::Wait.new(:timeout => 5) # Time less than implicit
@wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")}
Это теперь дает водителю 30 секунд для поиска текста (не ожидается)
Есть ли способ заставить селен ждать только explicit
время ожидания, а не для большего из двух?
Примечание. Нельзя объявлять неявное время ожидания, потому что я не могу позволить селену зависать каждый раз, когда водитель не может что-то найти.
Использование Selenium версии 30, windows, ff
2 ответа
Не смешивайте неявные и явные ожидания. Частично проблема заключается в том, что неявные ожидания часто (но не всегда!) Реализуются на "удаленной" стороне системы WebDriver. Это означает, что они "запекаются" в IEDriverServer.exe, chromedriver.exe, расширение WebDriver Firefox, которое устанавливается в анонимный профиль Firefox, и удаленный сервер Java WebDriver (selenium-server-standalone.jar). Явные ожидания реализованы исключительно в "локальных" языковых привязках. При использовании RemoteWebDriver все становится намного сложнее, потому что вы можете использовать как локальные, так и удаленные стороны системы несколько раз.
Вот как это будет работать: локальный код -> удаленный сервер Java -> привязки локального языка Java на удаленном сервере -> "удаленный" компонент, такой как расширение Firefox, chromedriver.exe или IEDriverServer.exe. В случае сетки это еще сложнее, так как между ними могут быть и другие прыжки.
Таким образом, когда вы пытаетесь смешать неявные и явные ожидания, вы впадаете в "неопределенное поведение". Возможно, вам удастся выяснить, каковы правила такого поведения, но они могут изменяться по мере изменения деталей реализации драйверов. Так что не делай этого.
Вы не должны испытывать "зависания", когда элемент не может быть найден, если вы не используете неявные ожидания. Драйвер должен немедленно сгенерировать исключение NoSuchElement.
Рекомендуется устанавливать implicitlyWait () в начале каждого теста и использовать WebDriverWait() для ожидания элемента или загрузки элемента AJAX.
Однако неявно Wait () и WebDriverWait() не работают вместе в одном тесте. Вы должны были бы обнулить implicitlyWait () перед вызовом WebDriverWait, потому что implicitlyWait () также устанавливает время ожидания "driver.findElement ()".
Всякий раз, когда вы используете WebDriverWait() с implicitlyWait () уже установили некоторое начальное значение, следуйте инструкциям -
- аннулирование неявно Wait ()
- выполнение WebDriverWait() и возврат элемента
- сбросить неявно Wait () снова
Пример кода Java -
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //nullify implicitlyWait()
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
element = wait.until(ExpectedConditions.visibilityOfElementLocated(by));
driver.manage().timeouts().implicitlyWait(DEFAULT_WAIT_4_PAGE, TimeUnit.SECONDS);