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

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

Автоматизация веб-приложения оптимизирует работу, помогает свести к минимуму ошибки и делает продукт надежным…. Помеченный как selenium, java, автоматизация.

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

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

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

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

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

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

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

Ниже приведен синтаксис для 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; давайте посмотрим, почему Thread.sleep() Java используется в автоматизации тестирования Selenium.

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

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

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

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

Уменьшите Сложность Кода:

Во время тестирования веб-страницы существует вероятность того, что страница загружена, и выполнение перешло к следующему шагу, но не хватило времени для выбора опции на веб-странице. В таких случаях мы можем использовать либо плавное ожидание, чтобы приостановить время, пока элемент не станет видимым на странице, либо использовать 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() была бы одним из лучших вариантов при выполнении тестов.

Теперь, когда вы понимаете, почему функция 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() в Selenium Java, потому что это статическое ожидание. У 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() и ожиданиями селена-

  • Sleep – это статический метод, который относится к классу “Поток” Java. С другой стороны, Неявные, явные и плавные ожидания Селена динамичны по своей природе.
  • Если вы используете Thread.sleep при выполнении автоматизации тестирования Selenium, он остановит выполнение скрипта на время, указанное в скрипте, независимо от того, был ли найден элемент на веб-странице. Ожидания селена не дожидаются полного промежутка времени. Если WebDriver может найти элемент до истечения указанного времени, он переходит к следующей строке кода. Это помогает значительно сократить общее время выполнения скрипта.
  • Ожидания часто применяются глобально, т.е. нам нужно написать их только один раз в сценарии, и они применимы ко всем веб-элементам, указанным в экземпляре 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://dev.to/shalinibaskaran12/how-to-use-thread-sleep-in-java-with-selenium-4fbo”