Как я могу попросить Selenium-WebDriver ждать несколько секунд в Java?


Answers

Если вы используете webdriverJs (node.js),

driver.findElement(webdriver.By.name('btnCalculate')).click().then(function() {
    driver.sleep(5000);
});

Приведенный выше код заставляет браузер ждать 5 секунд после нажатия кнопки.

Question

Я работаю над Java Selenium-WebDriver. я добавил

driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);

а также

WebElement textbox = driver.findElement(By.id("textbox"));

потому что мои приложения занимают несколько секунд, чтобы загрузить пользовательский интерфейс. Поэтому я установил 2 секунды implicitwait. но я не смог найти текстовое поле элемента

Затем я добавляю Thread.sleep(2000);

Теперь он работает нормально. Какой из них лучше?




Thread.sleep(1000);

хуже: быть статическим ожиданием, это сделает тестовый скрипт медленнее.

driver.manage().timeouts.implicitlyWait(10,TimeUnit.SECONDS);

это динамическое ожидание

  • он действителен до существования webdriver или имеет область действия до срока службы драйвера
  • мы также можем подразумевать ожидание.

Наконец, я предлагаю

WebDriverWait wait = new WebDriverWait(driver,20);
wait.until(ExpectedConditions.<different canned or predefined conditions are there>);

с некоторыми предопределенными условиями:

isAlertPresent();
elementToBeSelected();
visibilityOfElementLocated();
visibilityOfAllElementLocatedBy();
frameToBeAvailableAndSwitchToIt();
  • Это также динамическое ожидание
  • в этом ожидание будет только в секундах
  • мы должны использовать явное ожидание определенного веб-элемента, который мы хотим использовать.



Использование Thread.sleep(2000); является безусловным ожиданием. Если ваш тест загружается быстрее, вам все равно придется ждать. Таким образом, в принципе использование implicitlyWait является лучшим решением.

Однако я не понимаю, почему implicitlyWait не работает в вашем случае. Вы измеряли, если findElement фактически занимает две секунды, прежде чем выбрасывать исключение. Если да, можете ли вы попытаться использовать условное ожидание WebDriver, как описано в this ответе?




щелчок блокируется? - вот еще один способ подождать, если вы используете WebDriverJS:

driver.findElement(webdriver.By.name('mybutton')).click().then(function(){
  driver.getPageSource().then(function(source) {
    console.log(source);
  });
});

Вышеуказанный код ждет после нажатия кнопки для загрузки следующей страницы и последующего захвата источника следующей страницы.




Иногда неявное ожидание, похоже, становится переопределенным, а время ожидания сокращается. [@ Евгений.Польщиков] имел хорошую документацию на whys. Я нашел в своем тестировании и кодировании Selenium 2, что подразумеваемые ожидания хороши, но иногда вам приходится ждать явно.

Лучше избегать прямого вызова потока, чтобы спать, но иногда это не очень хорошо. Тем не менее, есть другие варианты поддержки селена, которые помогают. waitForPageToLoad и waitForFrameToLoad оказались особенно полезными.




Ответ : подождите несколько секунд, прежде чем видимость элемента с помощью Selenium WebDriver пройдет ниже методов.

implicitlyWait () : экземпляр WebDriver ожидает полной загрузки страницы. Вам нужно использовать 30-60 секунд, чтобы дождаться загрузки полной страницы.

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

ExplicitlyWait WebDriverWait () : экземпляр WebDriver ожидает полной загрузки страницы.

WebDriverWait wait = new WebDriverWait(driver, 60);

wait.until(ExpectedConditions.visibilityOf(textbox));

driver.findElement(By.id("Year")).sendKeys(allKeys);

Примечание . Для обработки любого конкретного WebElement используйте ExplicitlyWait WebDriverWait ().




Неявное ожидание: во время неявного ожидания, если веб-драйвер не сможет найти его сразу из-за его доступности, WebDriver будет ждать указанного времени и не будет пытаться снова найти элемент в течение указанного периода времени. Как только указанное время закончится, он попытается снова выполнить поиск элемента в последний раз перед тем, как выбросить исключение. Значение по умолчанию равно нулю. Как только мы установим время, веб-драйвер ждет период экземпляра объекта WebDriver.

Явное ожидание: может быть экземпляр, когда конкретный элемент занимает больше минуты, чтобы загрузить. В этом случае вам определенно не нравится устанавливать огромное время на Implicit wait, как если бы вы сделали это, ваш браузер будет ждать того же времени для каждого элемента. Чтобы избежать этой ситуации, вы можете просто выделить отдельное время только для требуемого элемента. Следуя этому, ваше молчаливое время ожидания вашего браузера будет кратким для каждого элемента, и оно будет большим для определенного элемента.




Links