Я работаю над Java Selenium-WebDriver. я добавил
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
и
WebElement textbox = driver.findElement(By.id("textbox"));
потому что моим приложениям требуется несколько секунд для загрузки пользовательского интерфейса. Поэтому я установил неявное ожидание в 2 секунды. но мне не удалось найти текстовое поле элемента
Затем я добавляю Thread.sleep(2000);
Теперь работает нормально. Какой способ лучше?
Ответы:
Итак, есть два типа ожидания: явное и неявное. Идея явного ожидания
Концепция неявного ожидания
Вы можете узнать подробности здесь .
В таких ситуациях я бы предпочел использовать явное ожидание (
fluentWait
в частности):fluentWait
функция возвращает найденный вами веб-элемент. Из документацииfluentWait
: реализация интерфейса ожидания, для которой время ожидания и интервал опроса могут быть настроены на лету. Каждый экземпляр FluentWait определяет максимальное время ожидания условия, а также частоту проверки условия. Кроме того, пользователь может настроить ожидание, чтобы игнорировать определенные типы исключений во время ожидания, такие как NoSuchElementExceptions, при поиске элемента на странице. Подробности вы можете получить здесьИспользование
fluentWait
в вашем случае будет следующим:Этот подход IMHO лучше, поскольку вы точно не знаете, сколько времени ждать, а в интервале опроса вы можете установить произвольное значение времени, через которое будет проверяться наличие элемента. С уважением.
источник
import com.google.common.base.Function;
не такimport java.util.function.Function;
Function
было использовано. Сначала для меня это было неочевидно. Спасибо за ответ.driver -> driver.findElement(locator)
. При его использовании вам вообще не понадобится оператор импорта..withTimeout(Duration.ofSeconds(30)).pollingEvery(Duration.ofSeconds(5))
вместо:.withTimeout(30, TimeUnit.SECONDS).pollingEvery(5, TimeUnit.SECONDS)
Эта ветка немного старше, но я подумал, что опубликую то, что я сейчас делаю (работа в процессе).
Хотя я все еще сталкиваюсь с ситуациями, когда система находится под большой нагрузкой, и когда я нажимаю кнопку отправки (например, login.jsp), все три условия (см. Ниже) возвращаются,
true
но следующая страница (например, home.jsp) не работает. т еще не начал загружаться.Это общий метод ожидания, который принимает список ожидаемых условий.
Я определил различные ожидаемые условия многократного использования (три ниже). В этом примере три ожидаемых условия включают document.readyState = 'complete', отсутствие "wait_dialog" и отсутствие "счетчиков" (элементы, указывающие, что запрашиваются асинхронные данные).
Только первый из них может применяться ко всем веб-страницам.
В зависимости от страницы я могу использовать один или все из них:
Также есть предопределенные ExpectedConditions в следующем классе: org.openqa.selenium.support.ui.ExpectedConditions
источник
Если вы используете webdriverJs (node.js),
Приведенный выше код заставляет браузер ждать 5 секунд после нажатия кнопки.
источник
Использование
Thread.sleep(2000);
- это безусловное ожидание. Если ваш тест загружается быстрее, вам все равно придется подождать. Так что в принципе использованиеimplicitlyWait
- лучшее решение.Однако я не понимаю, почему
implicitlyWait
в вашем случае не работает. Вы измеряли,findElement
действительно ли требуется две секунды, прежде чем выбросить исключение. Если да, можете ли вы использовать условное ожидание WebDriver, как описано в этом ответе?источник
Мне нравится использовать индивидуальные условия. Вот код на Python:
Когда вам нужно подождать, вы можете сделать это явно, проверив наличие определенного элемента (такой элемент может отличаться от страницы к странице).
find_elements_by_id
возвращает список - пустой или нет, вам остается только проверить.источник
кажется, что щелчок блокирует? - вот еще один способ подождать, если вы используете WebDriverJS:
Приведенный выше код ожидает после нажатия кнопки загрузки следующей страницы, а затем захватывает источник следующей страницы.
источник
Неявно wait и Thread.sleep Оба используются только для синхронизации .. но разница в том, что мы можем использовать неявно ждать для всей программы, но Thread.sleep будет работать только для этого единственного кода. Здесь мое предложение использовать неявно ждать один раз в программе когда каждый раз, когда ваша веб-страница будет обновляться, значит использовать Thread.sleep в то время .. это будет намного лучше :)
Вот мой код:
источник
Иногда кажется, что неявное ожидание отменяется и время ожидания сокращается. [@ eugene.polschikov] имел хорошую документацию о том, почему. При тестировании и кодировании с помощью Selenium 2 я обнаружил, что неявное ожидание - это хорошо, но иногда приходится ждать явно.
Лучше избегать прямого вызова спящего потока, но иногда нет хорошего способа обойти это. Однако есть и другие варианты ожидания, предоставляемые Selenium, которые помогают. Особенно полезными оказались waitForPageToLoad и waitForFrameToLoad .
источник
Неявное ожидание: во время неявного ожидания, если веб-драйвер не может найти его немедленно из-за его доступности, веб-драйвер будет ждать указанное время и не будет пытаться найти элемент снова в течение указанного периода времени. По истечении указанного времени он попытается выполнить поиск элемента еще раз перед генерацией исключения. Значение по умолчанию - ноль. После того, как мы установим время, веб-драйвер ждет периода экземпляра объекта WebDriver.
Явное ожидание: может быть случай, когда для загрузки определенного элемента требуется больше минуты. В этом случае вам определенно не нравится устанавливать огромное время для неявного ожидания, поскольку если вы это сделаете, ваш браузер будет ждать одинаковое время для каждого элемента. Чтобы избежать этой ситуации, вы можете просто выделить время только для необходимого элемента. Следуя этому, ваш браузер неявно ждет время ожидания будет коротким для каждого элемента и большим для конкретного элемента.
источник
Иногда неявное ожидание терпит неудачу, говоря, что элемент существует, но на самом деле его нет.
Решение состоит в том, чтобы избежать использования driver.findElement и заменить его специальным методом, который неявно использует явное ожидание. Например:
Есть дополнительные причины избегать неявного ожидания, кроме спорадических, случайных сбоев (см. Эту ссылку ).
Вы можете использовать этот "элементный" метод так же, как driver.findElement. Например:
Если вы действительно хотите просто подождать несколько секунд для устранения неполадок или другого редкого случая, вы можете создать метод паузы, аналогичный тому, что предлагает selenium IDE:
источник
Ответ : подождите несколько секунд, прежде чем видимость элемента с помощью Selenium WebDriver будет выполняться следующими способами.
implicitlyWait () : экземпляр WebDriver ожидает полной загрузки страницы. Вы можете использовать от 30 до 60 секунд, чтобы дождаться полной загрузки страницы.
ExplicitlyWait WebDriverWait () : экземпляр WebDriver ожидает полной загрузки страницы.
Заметка . Используйте ExplicitlyWait WebDriverWait () для обработки любого конкретного WebElement.
источник
Использовать действия -
См. Действия # метод паузы .
источник
Я предпочитаю, чтобы следующий код подождал 2 секунды.
источник
хуже: статическое ожидание замедлит выполнение тестового сценария.
это динамическое ожидание
Наконец, я предлагаю
с некоторыми предопределенными условиями:
источник
Это помогло мне, но об исключении InterruptedException нужно позаботиться. Так что лучше окружите это попыткой поймать:
ИЛИ
Добавить объявление бросков:
Я бы предпочел второй, так как затем можно использовать
sleep()
столько раз, сколько захочет, и избежать повторенияtry
иcatch
блокировки каждый раз, где быsleep()
он ни использовался.источник