Статьи

Как настроить Selenium Grid для параллельного выполнения в разных браузерах

Selenium — наиболее часто используемый инструмент для тестирования веб-автоматизации. Одной из причин такой огромной популярности являются возможности автоматического кросс-браузерного тестирования Selenium. Автоматизированное тестирование Selenium может помочь вам протестировать все основные браузеры, все основные операционные системы и даже браузеры мобильных устройств. Вы можете получить широкий охват браузера во всех ваших функциональных тестах, гарантируя идеальный опыт для широкого круга ваших потенциальных пользователей.

Но есть проблема. Вы можете загрузить только столько разных браузеров на свой локальный компьютер. Например, если у вас есть компьютер с Windows, вы не можете тестировать в браузерах Safari, аналогично, если у вас есть компьютер Mac, вы не сможете проводить тестирование в браузерах IE или Edge. Кроме того, выполнение тестов на одном компьютере было трудоемким процессом. Если у вас несколько компьютеров, зачем тестировать по одному?

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

И это именно то, для чего создана Selenium Grid. В отличие от Selenium WebDriver, который позволяет вам выполнять автоматическое межбраузерное тестирование последовательно, настройка Selenium Grid позволит вам запускать тестовые случаи в разных браузерах / версиях браузера одновременно.

Что такое селеновая сетка?

Прежде чем мы начнем с настройки Selenium Grid, необходимо осознать основы Selenium Grid.

Таким образом, Selenium Grid позволяет нам запускать наши автоматические тесты на разных операционных системах для разных браузеров. И это тоже параллельно. Средство автоматизации тестирования Selenium поможет вам быстрее автоматизировать кросс-браузерное тестирование, а также эффективно использовать собственное оборудование.

Selenium Grid состоит из двух понятий:

  • Концентратор: это центр архитектуры настройки Selenium Grid, который управляет сетью тестовых машин. В сети есть только один концентратор, который назначен тесту DesiredCapabilities (операционная система, браузер, версии браузера), а затем концентратор находит тест, соответствующий заданным конфигурациям.
  • Узел. Узлы — это тестовые машины, которые выполняют тест, ранее загруженный в концентратор. Может быть несколько узлов, настроенных с другой операционной системой и разными браузерами. Узел не обязательно должен работать на той же платформе, на которой работает концентратор.

Инфраструктура для настройки установки Selenium Grid для параллельного выполнения состоит из двух шагов:

  1. Создание хаба.
  2. Определение узлов и подключение к этому концентратору.

Использование командной строки для настройки Selenium Grid

Первым этапом настройки Selenium Grid будет создание концентратора. Вы должны убедиться, что в вашей системе установлена ​​Java Runtime Environment (JRE) или, что еще лучше, Java Development Kit (JDK). Хотя большинство людей рекомендуют использовать последнюю версию JDK, я предпочитаю более ранние и проверенные версии, такие как JDK SE 08 или 09. Вы можете выбрать самую последнюю версию, если хотите. Вот следующие шаги —

  • Загрузите и распакуйте файлы JAR сервера Selenium Standalone. Вы можете скачать их здесь .
  • Затем откройте командную строку или терминал и перейдите в каталог, где сохранен файл JAR автономного сервера Selenium.
  • Запустите команду «java -jar selenium-server-standalone-3.141.59.jar -role hub». Эта команда запускает концентратор Selenium Grid на порту 4444 по умолчанию. Вы также можете проверить то же самое, перейдя по адресу http: // localhost: 4444 / grid / console .

Поскольку концентратор уже создан, следующий шаг к настройке Selenium Grid для параллельного выполнения будет включать запуск узла. Вы начинаете с перехода на другие машины, где мы хотим настроить узлы. Опять же, эти машины должны иметь настройку JDK / JRE.

На узле машины откройте командную строку или терминал и перейдите в каталог, в котором вы сохранили файлы драйвера браузера.

Введите ниже команду, чтобы настроить драйвер Chrome в настройках Selenium Grid для параллельного выполнения .

1
2
3
“java -Dwebdriver.chrome.driver="C:\chromedriver.exe" -jar
selenium-server-standalone-3.141.59.jar -role webdriver -hub
http://10.0.0.22:4444/grid/register -port 4546”
  • В приведенной выше команде я использовал IP-адрес компьютера и порт 4444, на котором фактически работает концентратор. Я также выбрал порт 4546, где я хочу, чтобы мой узел был зарегистрирован. Вы можете выбрать любой свободный порт для регистрации узла.

Точно так же вы можете зарегистрировать другие узлы для других браузеров. Например, вот как вы можете настроить драйвер Firefox (Gecko) и драйвер Internet Explorer для настройки Selenium Grid для параллельного выполнения.

Настройка драйвера Firefox (Gecko) в настройке Selenium Grid:

1
2
3
“java -Dwebdriver.gecko.driver="C:\geckodriver.exe" -jar
selenium-server-standalone-3.141.59.jar -role webdriver -hub
http://10.0.0.22:4444/grid/register -port 5566”

Настройка драйвера IE (Internet Explorer) в настройке Selenium Grid:

1
2
3
“java -Dwebdriver.ie.driver="C:\IEDriverServer.exe" -jar
selenium-server-standalone-3.141.59.jar -role webdriver -hub
http://10.0.0.22:4444/grid/register -port 4547”

Примечание. Убедитесь, что вы выбрали разные порты для разных узлов, чтобы подключиться к одному концентратору, работающему на порту 4444. Кроме того, перед запуском теста в IE убедитесь, что масштаб браузера точно равен 100%, иначе это может привести к ошибке.

Вы можете заметить приведенными выше командами, что мы запускаем наш первый узел для драйвера chrome на порту 4546, второй узел для драйвера firefox работает на порту 5566, а третий узел для браузера IE работает на порту 4547. Вот скриншот вывода для дальнейшего использования:

Теперь, когда мы настроили нашу настройку Selenium Grid, ваш следующий шаг — выполнить автоматизированное тестирование Selenium для вашего кросс-браузерного пакета тестирования.

Выполнить тестирование автоматизации с сеткой селена для параллельного выполнения

Настало время автоматизированного кросс-браузерного тестирования! Я буду запускать скрипт автоматизации, демонстрирующий Selenium Grid для параллельного выполнения. Этот сценарий будет работать параллельно в Chrome, Firefox и Internet Explorer, которые зарегистрированы на разных портах и ​​подключены к одному концентратору.

Вот пример кода, который я использовал для автоматизации тестирования с Selenium Grid для параллельного выполнения в разных браузерах.

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package DemoAutomation;
  
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
  
import org.openqa.selenium.By;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
  
  
public class Selenium_MultiBrowser_Test
{
    WebDriver driver;
    String nodeURL;
     
    @Parameters({"Port"})
    @BeforeMethod()
    public void setUp(String Port) throws MalformedURLException
    {          
        if(Port.equalsIgnoreCase("4546"))
        {
            nodeURL = "http://10.0.0.22:4546/wd/hub";
            System.out.println("Chrome Browser Initiated");
            DesiredCapabilities capabilities = DesiredCapabilities.chrome();            
            capabilities.setBrowserName("chrome");
            capabilities.setPlatform(Platform.WINDOWS);
             
            driver = new RemoteWebDriver(new URL(nodeURL),capabilities);
             
            driver.get("https://www.apple.com/");
            driver.manage().window().maximize();
            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        }
         
        else
            if(Port.equalsIgnoreCase("5566"))
            {
                nodeURL = "http://10.0.0.22:5566/wd/hub";
                System.out.println("Firefox Browser Initiated");
                DesiredCapabilities capabilities1 = DesiredCapabilities.firefox();
                capabilities1.setBrowserName("firefox");
                capabilities1.setPlatform(Platform.WINDOWS);
                 
                driver = new RemoteWebDriver(new URL(nodeURL),capabilities1);  
                 
                driver.get("https://www.apple.com/");
                driver.manage().window().maximize();
                driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
            }
         
        else
             
        if(Port.equalsIgnoreCase("4547"))
        {
            nodeURL = "http://10.0.0.22:4547/wd/hub";
            System.out.println("Internet Browser Initiated");
            DesiredCapabilities capabilities2 = DesiredCapabilities.internetExplorer();
            capabilities2.setBrowserName("internet explorer");
            capabilities2.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
            capabilities2.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, true);
            capabilities2.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
            capabilities2.setCapability("ignoreProtectedModeSettings", true);
            capabilities2.setCapability("nativeEvents", false);
            capabilities2.setCapability(InternetExplorerDriver.INITIAL_BROWSER_URL, "");
            capabilities2.setCapability(InternetExplorerDriver.LOG_LEVEL, "DEBUG");
              
             
            capabilities2.setPlatform(Platform.WINDOWS);
             
            driver = new RemoteWebDriver(new URL(nodeURL),capabilities2);
             
            driver.get("https://www.apple.com/");
            driver.manage().window().maximize();    
            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        }
    }
     
    @Test
    public void appleSite() throws InterruptedException
    {
        try
        {
         
        driver.findElement(By.xpath("//*[@id=\'ac-globalnav\']/div/ul[2]/li[3]")).click();
        Thread.sleep(2000);
  
        driver.findElement(By.cssSelector("#chapternav > div > ul > li.chapternav-item.chapternav-item-ipad-air > a > figure")).click();
        Thread.sleep(2000);
  
        driver.findElement(By.linkText("Why iPad")).click();
        Thread.sleep(2000);
        }
         
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
  
     
    @AfterMethod()
    public void tearDown()
    {
            driver.quit();
            System.out.println("Browser Closed");
    }
}

Выше приведен файл класса Java, который настроен с помощью файла XML, который включает значения параметров, передаваемых в файле Java, а также помогает в создании набора различных классов, которые будут работать параллельно.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="3" name="BlogSuite" parallel="tests">
  
<test name="Chrome Test">
<parameter name="Port" value="4546"/>
    <classes>
      <class name="DemoAutomation.Selenium_MultiBrowser_Test"/>
       
    </classes>
  </test>
   
  <test name="Firefox Test">
<parameter name="Port" value="5566"/>
    <classes>
      <class name="DemoAutomation.Selenium_MultiBrowser_Test"/>
       
    </classes>
  </test>
   
   
  <test name="Internet Explorer Test">
<parameter name="Port" value="4547"/>
    <classes>
      <class name="DemoAutomation.Selenium_MultiBrowser_Test"/>
       
    </classes>
  </test>
   
   
  </suite>

Экран вывода:

В приведенном выше коде я использовал класс DesiredCapabilities , который поможет вам установить свойства для Selenium WebDriver. Эти свойства можно использовать для настройки экземпляров браузера, таких как BrowserName и BrowserVersion, на которых вы хотите, чтобы ваш скрипт запускался.

Примечание. Однако скрипт будет работать только в браузере и версии браузера, установленной на тестовом компьютере. Предположим, если вы попытаетесь запустить тест на Chrome 72, и на вашем тестовом компьютере будет установлен только Chrome 74, тогда ваш скрипт выдаст ошибку. Этот же сценарий происходит, когда вы выбираете другую операционную систему по сравнению с операционной системой ваших тестовых компьютеров.

Кроме того, каждый раз, когда запускается новая ОС, стоит инвестировать в новые среды Mac и Windows.

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

Проведение автоматизированных тестов на облаке LambdaTest Selenium Grid

Давайте попробуем запустить наш тот же тестовый пример на LambdaTest Selenium Grid. Вы можете использовать LambdaTest Desired Capabilities Generator для настройки объекта требуемых возможностей. Это сэкономит вам много времени, потраченного на настройку Selenium Grid, если вы будете делать это вручную.

С LambdaTest вам нужно всего лишь создать удаленный сервер, добавить свое имя пользователя LambdaTest, ключ доступа и URL-адрес сетки в ваш скрипт, и тогда все готово .

Ниже приведен код Java в среде TestNG, который будет более полезным в этом сценарии:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package lambdatest;
import java.net.MalformedURLException;
import java.net.URL;
  
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
  
  
public class SampleTest {
   public String username = "enteryourusernamehere";
  public String accesskey = "enteryourkeyhere";
  public RemoteWebDriver driver = null;
  public String gridURL = "@hub.lambdatest.com/wd/hub";
  boolean status = false;
  
  @BeforeTest
  @org.testng.annotations.Parameters(value={"browser","version","platform"})
  public void setUp(String browser, String version, String platform) throws Exception {
     DesiredCapabilities capabilities = new DesiredCapabilities();
      capabilities.setCapability("browserName", browser);
      capabilities.setCapability("version", version);
      capabilities.setCapability("platform", platform); // If this cap isn't specified, it will just get the any available one
      capabilities.setCapability("build", "Selenium Grid");
      capabilities.setCapability("name", "Sample Test");
      capabilities.setCapability("network", true); // To enable network logs
      capabilities.setCapability("visual", true); // To enable step by step screenshot
      capabilities.setCapability("video", true); // To enable video recording
      capabilities.setCapability("console", true); // To capture console logs
      try {
          driver = new RemoteWebDriver(new URL("https://" + username + ":" + accesskey + gridURL), capabilities);
      } catch (MalformedURLException e) {
          System.out.println("Invalid grid URL");
      } catch (Exception e) {
          System.out.println(e.getMessage());
      }
  }
  
  @Test
  public void testSimple() throws Exception {
     try {
             
            driver.get("https://www.apple.com/");
            driver.manage().window().maximize();
             
            driver.findElement(By.xpath("//*[@id=\'ac-globalnav\']/div/ul[2]/li[3]")).click();
            Thread.sleep(2000);
  
            driver.findElement(
            By.cssSelector("#chapternav > div > ul > li.chapternav-item.chapternav-item-ipad-air > a")).click();
            Thread.sleep(2000);
  
            driver.findElement(By.linkText("Why iPad")).click();
            Thread.sleep(2000);
           
      } catch (Exception e) {
          System.out.println(e.getMessage());
      }
  }
   
  
  @AfterTest
  public void tearDown() throws Exception {
     if (driver != null) {
          ((JavascriptExecutor) driver).executeScript("lambda-status=" + status);
          driver.quit();
      }
  }
}

Теперь мы запустили бы этот файл классов Java с файлом XML, который содержит значение параметров, передаваемых в файле Java, а также помогает в создании набора различных классов, используя которые, мы можем выполнить автоматизированное тестирование с Selenium Grid для параллельного выполнения на разные конфигурации.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="3" name="BlogSuite" parallel="tests">
  
  <test name="FirefoxTest">
  <parameter name="browser" value="firefox"/>
  <parameter name="version" value="62.0"/>
  <parameter name="platform" value="WIN8"/>
    <classes>
      <class name="lambdatest.SampleTest"/>
    </classes>
  </test>
  
  <test name="ChromeTest">
  <parameter name="browser" value="chrome"/>
  <parameter name="version" value="70.0"/>
  <parameter name="platform" value="WIN10"/>
    <classes>
      <class name="lambdatest.SampleTest"/>
    </classes>
  </test>
  
  <test name="SafariTest">
  <parameter name="browser" value="safari"/>
  <parameter name="version" value="11.0"/>
  <parameter name="platform" value="macos High Sierra"/>
    <classes>
      <class name="lambdatest.SampleTest"/>
    </classes>
  </test>
  
</suite>

Экран вывода:

Теперь мы успешно выполнили тестирование автоматизации с помощью Selenium Grid для параллельного выполнения в разных браузерах и в разных операционных системах, не создавая проблем с созданием концентратора и запуском узлов на разных портах. Пока тест выполняется в Selenium Grid, вы можете видеть прямую трансляцию видео ваших тестов и другие подробности, такие как команды, включающие снимок экрана каждой команды, переданной вашим сценарием, а также журналы и возникшие исключения.

Вы также можете создать свою собственную команду и запускать свои сценарии автоматического тестирования совместимости с различными браузерами. Эти результаты теста будут видны каждому участнику, добавленному в команду. Кроме того, благодаря нашей интеграции одним щелчком, ваши товарищи по команде могут регистрировать любую ошибку, обнаруженную во время сеанса кросс-браузерного тестирования, непосредственно на различных платформах управления проектами, таких как Jira, Trello, Asana, Mantis, GitHub и т. Д. Кроме того, LambdaTest также интегрируется с CI / CD платформы, которые дополняют ваши инструменты автоматизации тестирования, такие как CircleCI, Jenkins, TravisCI и т. д. Ознакомьтесь со всеми интеграциями LambdaTest .

Вывод

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

Автор

Работая экспертом по автоматизации в LambdaTest, недавно начал профессиональный путь. Исключительно в автоматизации тестирования Java.

Смотрите оригинальную статью здесь: Как настроить Selenium Grid для параллельного выполнения в разных браузерах

Мнения, высказанные участниками Java Code Geeks, являются их собственными.