CoderCastrov logo
CoderCastrov
Selenium

Использование параллельного потока Java 8 для более быстрых результатов в автоматизации Selenium

Использование параллельного потока Java 8 для более быстрых результатов в автоматизации Selenium
просмотров
2 мин чтение
#Selenium

Поток был впервые представлен в Java 8, и API используется для обработки коллекций объектов. В основном, поток представляет собой последовательность объектов, которая поддерживает различные методы, которые могут быть объединены в цепочку для получения желаемого результата.

Различные операции с потоками:

Но сегодня мы собираемся рассмотреть параллельный и последовательный поток Java и как мы можем воспользоваться этим.

Параллельные потоки Java - это функция Java 8 и выше, которая предназначена для использования нескольких ядер процессора. В общем случае, любой код на Java имеет один поток обработки, который выполняется последовательно.

Используя параллельные потоки:

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

Есть два способа создания параллельных потоков в Java:

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

Сценарии:

  1. Теперь нам нужно проверить статус-код каждого URL или работает ли URL или нет.

Код:

Здесь мы используем Selenium для извлечения URL из страниц и затем возвращаем List<String> обратно в вызывающий метод.

public static List<String> getLinkData() {
    List<String> dataList = new ArrayList<>();
    try {
        WebDriverManager.chromedriver().setup();
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--headless");
        
        WebDriver driver = new ChromeDriver(options);
        driver.get("https://www.google.com/search?q=java");
        List<WebElement> el = driver.findElements(By.tagName("a"));
        for (WebElement e : el) {
            String href = e.getAttribute("href");
            if(href!=null)
                dataList.add(href);
        }
        System.out.println("Найдено URL = "+dataList.size());
        return dataList;
    }
    catch (Exception ex){
        return dataList;
    }
}

Используем класс HttpURLConnection для получения статуса URL:

Код:

public static int getResponseCode(String address) {
    try {
        URL url = new URL(address);
        HttpURLConnection connection = 
        (HttpURLConnection)  url.openConnection();
        connection.setConnectTimeout(5000); 
        connection.setReadTimeout(5000);
        int responseCode = connection.getResponseCode();
        System.out.println("URL = "+siteUrl);
        System.out.println("Код ответа = "+responseCode);        
        connection.disconnect();
        return responseCode;
    } catch (IOException ex) {
        return 0;
    }
}

Код: Теперь давайте выполним код и посмотрим разницу

public static void main(String[] args) {

    //Последовательное выполнение
    long startTime = System.currentTimeMillis();
    List<String> list1 = getLinkData();
    list1.stream().forEach(url -> getResponseCode(url));
    long endTime = System.currentTimeMillis();


    //Параллельное выполнение
    long startTimeParallel = System.currentTimeMillis();
    List<String> list2 = getLinkData();
    list2.parallelStream().forEach(url -> getResponseCode(url));
    long endTimeParallel = System.currentTimeMillis();

    printExecutionTime(endTime-startTime);
    printExecutionTime(endTimeParallel-startTimeParallel);


}
public static void printExecutionTime(long milliseconds){
    long minutes = (milliseconds / 1000) / 60;
    long seconds = (milliseconds / 1000) % 60;
    // Выводим результат
    System.out.println(minutes + " минут и "
            + seconds + " секунд.");
}

Всего было найдено 120 URL на странице.

Теперь посмотрите на разницу ниже:

Бенчмаркинг:

Вы можете ясно увидеть разницу во времени выполнения обоих вариантов. И мы можем четко определить, что использование параллельного потока может ускорить весь процесс. В этом случае всего 120 URL-адресов, давайте подумаем о ситуации, когда нам нужно обработать или проверить большой объем данных.

Вещи, которые нужно помнить при использовании параллельного потока: