Рубрики
Без рубрики

Как Использовать Thread.sleep() На Яве С Селеном?

Вы когда-нибудь задумывались, как использовать Thread.sleep() в Java? В этом блоге объясняется все, что нужно знать о Thread.sleep() Java и использование Thread.sleep() в Selenium Java.

Автор оригинала: Shalini Baskaran.

Автоматизация веб-приложения оптимизирует работу, помогает свести к минимуму ошибки и делает продукт надежным. Автоматизированный набор будет успешным, когда поведение предсказуемо. Если бы это было не так, то в автоматизации возникло бы много препятствий, с которыми необходимо было бы обращаться осторожно. Иногда при автоматизации веб-приложения мы можем столкнуться с исключением NoSuchElementException, которое возникает, когда элемент, с которым взаимодействуют, не найден. Это может показаться странным, когда вы действительно видите элемент на веб-странице, но он исчез во время Автоматизации тестирования Selenium .

Основная причина этого исключения заключается в том, что элемент, с которым необходимо взаимодействовать, действительно существует на странице, но требуется время для загрузки и отображения пользователю. Как вы можете себе представить, это может оказаться серьезной проблемой во время автоматизации и может привести к тому, что наши сценарии станут пепельницей. Именно здесь в игру вступает функция Thread.sleep() в Java Selenium. Прежде чем мы рассмотрим эффективное использование функции Java Thread.sleep (), давайте разберемся в основах функции Thread.sleep() в Selenium.

Что такое Thread.sleep()?

Чтобы сделать наши сценарии менее запутанными, мы должны добавить ожидания, которые добавят некоторое время ожидания для загрузки элемента или всех элементов на веб-странице. Реализация этих ожиданий зависит от типа ожидания, выбранного в сценарии автоматизации. Два наиболее часто используемых Селеновых ожидания являются-

  1. Неявное ожидание- Это ожидание позволяет остановить веб-драйвер на определенный период времени, пока веб-драйвер не сможет найти нужный элемент на веб-странице.
  2. Явное ожидание- Это ожидание позволяет остановить выполнение сценария на основе заданного условия на определенный промежуток времени.

Однако есть несколько случаев, когда Thread.sleep() считался бы лучшим выбором.

Thread.sleep () – это статический метод Java, который приостанавливает выполнение кода на определенное время. Это приостанавливает выполнение и помогает нам узнать, что произошло во время паузы. Он принимает время, указанное в миллисекундах. Эта функция особенно полезна для отладки веб-сайта или веб-страницы. И это не следует путать с селеновыми ожиданиями, упомянутыми выше. Мы углубимся в разницу между Thread.sleep() Java и Selenium в следующих разделах.

Ниже приведен синтаксис для Thread.sleep() Ява-

//Pauses test execution for specified time in milliseconds
Thread.sleep(1000); 

При использовании этого метода вы можете столкнуться с распространенным исключением – исключением InterruptedException, которое необходимо обработать либо с помощью бросков, либо с помощью блока try catch, как показано ниже-

try{
Thread.sleep(1000);
}
catch(InterruptedException ie){
}

Or

public static void main(String args[]) throws InterruptedException{
Thread.sleep(1000);
}

В следующих разделах мы сначала поймем, почему и как использовать Thread.sleep() в Java; давайте рассмотрим, почему Java Thread.sleep() используется в автоматизации тестирования Selenium.

Почему мы используем Thread.sleep() в Selenium?

Поскольку веб-приложения с каждой минутой становятся все больше, неудивительно, что для полной загрузки разных приложений требуется разное время. Функция Thread.sleep() играет ключевую роль в включении загрузки страниц в наши сценарии Selenium. Использование таких функций, как Thread.sleep() Java, позволяет нам успешно выполнять автоматические тесты без каких-либо сбоев в работе скрипта. Ниже приведены некоторые основные причины, по которым мы используем Thread.sleep() в Selenium Java-

Обрабатывать Динамические Элементы:

Могут возникнуть ситуации, когда веб-страница приложения содержит динамические элементы, и будет трудно предсказать поведение. Например, большинство веб-сайтов электронной коммерции имеют дизайн карусели/слайдера, который динамически меняется. Вместо того, чтобы использовать Selenium waits для проверки видимости веб-элемента, мы можем разумно выбрать Thread.sleep (), чтобы подождать несколько секунд.

Снижение Сложности Кода:

При тестировании веб-страницы существует вероятность того, что страница загружена, и выполнение перешло на следующий шаг, но не хватило времени, чтобы выбрать опцию на веб-странице. В таких случаях мы можем использовать либо Fluent waits, чтобы приостановить время до тех пор, пока элемент не будет виден на странице, либо использовать Thread.sleep(). Лучше выбрать последнее, так как оно предполагает добавление одной строки кода, а не добавление пяти-шести строк кода в Selenium waits. Такая реализация позволит избежать ненужной сложности кода.

Вместо того, чтобы усложнять код нижеприведенными строками, мы можем использовать Thread.sleep() в течение некоторого времени, что снижает сложность.

Wait wait = new FluentWait(driver)
       .withTimeout(30, SECONDS)
       .pollingEvery(5, SECONDS)
       .ignoring(NoSuchElementException.class);

   WebElement element = wait.until(new Function() {
     public WebElement apply(WebDriver driver) {
       return driver.findElement(By.id("username"));
     }
   });

Тестирование Сторонних Систем:

При тестировании веб-страниц, которые взаимодействуют со сторонними компонентами, мы можем не знать, как они были разработаны. Мы можем не знать, сколько времени требуется, чтобы веб-элемент был виден на веб-странице. Следовательно, прогнозирование условий для обработки веб-элементов кажется сложным, иногда даже невозможным. В таких ситуациях мы можем задержать время выполнения с помощью Java-метода Thread.sleep ().

Обработка вызовов AJAX:

AJAX (асинхронный JavaScript и XML) – это продвинутый метод связи, при котором веб-страница запрашивает определенную информацию с сервера, не влияя на текущее состояние веб-страницы. Функция Thread.sleep() будет одним из лучших вариантов обработки вызовов AJAX на веб-странице, так как тест будет ждать определенного периода ответа сервера. Существуют определенные веб-страницы, на которых вы можете увидеть результаты матчей по крикету или футболу в реальном времени. Здесь оценка обновляется через определенные промежутки времени, в то время как все остальные элементы на веб-странице остаются прежними. Это пример вызова AJAX и того, как его обработка с помощью Thread.sleep() была бы одним из лучших вариантов при выполнении тестов.

Кодировка Jag

Теперь, когда вы понимаете, почему функция Thread.sleep() в Selenium Java является хорошим выбором, в этом разделе будет показано, как реализовать эту функцию в Selenium test automation . Чтобы продемонстрировать его реализацию, мы используем пример веб – сайта- easemytrip.com. Здесь мы покажем вам пользователя экземпляра, выбирающего пункт назначения “От” и “До” , а также дату поездки.

Как и ожидалось, easemytrip.com потребуется некоторое время, чтобы загрузить соответствующие данные о рейсе. Чтобы избежать этой задержки в нашем скрипте, мы остановим выполнение потока, как только пользователь нажмет на кнопку “Поиск”. Как только мы это сделаем, вы увидите, что скрипт будет работать плавно, без возникновения исключения или ошибки.

Вот фрагмент кода-

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import com.gargoylesoftware.htmlunit.javascript.background.JavaScriptExecutor;

public class ThreadWait {

    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        
        //setting the driver executable
        System.setProperty("webdriver.chrome.driver", ".\\Driver\\chromedriver.exe");
        
        //Initiating your chromedriver
        WebDriver driver=new ChromeDriver();
        
        driver.manage().window().maximize();
        
        
        driver.get("https://www.easemytrip.com/");
        
        driver.findElement(By.id("FromSector_show")).sendKeys("Delhi", Keys.ENTER);
        driver.findElement(By.id("Editbox13_show")).sendKeys("Mumbai", Keys.ENTER);
        driver.findElement(By.id("ddate")).click();
        driver.findElement(By.id("snd_4_08/08/2019")).click();
        driver.findElement(By.className("src_btn")).click();
        Thread.sleep(5000);
        driver.findElement(By.xpath("//button[text()='Book Now']")).click();    

    }

}

Давайте рассмотрим другой пример. Что, если у нас есть еще одна веб-страница на easemytrip.com это занимает меньше или больше указанного времени для загрузки? Время, затраченное на поиск элемента, просто не учитывается, когда дело доходит до Thread.sleep() в Java Selenium, потому что это статическое ожидание. У Selenium WebDriver не будет другого выбора, кроме как ждать указанного времени, независимо от того, был ли элемент обнаружен или нет. Вот почему мы предпочитаем не использовать Thread.sleep() несколько раз в наших сценариях автоматизации.

Альтернативы Thread.sleep() Ява

Люди часто спрашивают: “Хорошая ли практика использовать Thread.sleep()?” или ” Что я могу использовать вместо Thread.sleep()?”

Ну, функция Thread.sleep() была предоставлена Java, но при использовании в сценариях автоматизации она часто считается нестабильной. В идеале не рекомендуется использовать Thread.sleep() в наших сценариях, так как это может увеличить время выполнения теста (как описано в последнем разделе). Хотя при выполнении тестов со сторонними интерфейсами и вызовами AJAX всегда может показаться сложным, что при разумной обработке с надлежащим ожиданием, таким как Thread.sleep (), облегчит выполнение с высокой точностью результатов.

Если это не относится к вам, вам, возможно, лучше использовать другие ожидания Selenium, такие как Неявное ожидание, Явное ожидание или Свободное ожидание. Вы можете обратиться к этому руководству по использованию явного и свободного ожидания в Selenium.

Разница Между Thread.sleep () и Ожиданиями

Ожидание полностью останавливает поток выполнения на указанное время. С другой стороны, функция Thread.sleep() приостанавливает выполнение и помогает нам узнать, что произошло. Но это еще не все. Ниже перечислены ключевые различия между методом Java Thread.sleep() и ожиданием Selenium-

  • Sleep – это статический метод, который принадлежит классу Java “Поток”. С другой стороны, неявное, явное и свободное ожидание Селена носит динамический характер.
  • Если вы используете Thread.sleep при выполнении автоматизации тестирования Selenium, это остановит выполнение сценария на время, указанное в сценарии, независимо от того, был ли найден элемент на веб-странице. Селен ждет не ждите в течение всего времени. Если веб-драйверу удается найти элемент до указанного времени, он переходит к следующей строке кода. Это помогает значительно сократить общее время выполнения скрипта.
  • Ожидания часто применяются глобально, т. е. нам нужно написать его только один раз в сценарии, и он применим ко всем веб-элементам, указанным в экземпляре WebDriver. Это не относится к Thread.sleep(), где вы должны написать его снова для каждого веб-элемента. Это делает waits лучшим вариантом, чем Thread.sleep() в Selenium Java.

Разница между Thread.sleep () и Selenium setSpeed()

Как мы видели выше, как использовать Thread.sleep() в Java, мы ясно понимаем, что он используется для задержки выполнения кода. Функция set Speed() выполняет аналогичную роль и также используется для задержки выполнения. Тем не менее, эти две функции отличаются друг от друга.

Selenium setSpeed() в основном используется для задания определенной скорости выполнения. При запуске скрипта в Selenium по умолчанию задержка отсутствует. С помощью функции set Speed () мы можем установить продолжительность задержки (в миллисекундах), за которой затем будет следовать каждое выполнение в этом сценарии Selenium.

Проще говоря, Thread.sleep() заставляет веб-драйвер ждать определенное время перед выполнением, и это происходит только один раз. С другой стороны, setSpeed() задает желаемую скорость выполнения или задерживает выполнение на определенное количество времени перед каждой операцией.

Вывод

Мы надеемся, что вы, ребята, изучили эффективные способы использования Thread.sleep() Метод Java, прочитав эту статью. Thread.sleep() Java является полезным методом, когда дело доходит до отладки веб-приложений, и даже может быть реализован с помощью онлайн-сетки Selenium для платформ кросс-браузерного тестирования, таких как LambdaTest.

Сообщите нам, сталкивались ли вы с какими-либо другими сценариями, в которых вы нашли лучший способ эффективной реализации этого метода. Кроме того, если у вас есть какие-либо вопросы, не стесняйтесь обращаться к нам через раздел комментариев ниже.

Счастливого Тестирования!

Оригинал: “https://www.codementor.io/@shalinibaskaran12/how-to-use-thread-sleep-in-java-with-selenium-1c304cj0b5”