Zapisy otwarte! Dołącz do kursu Selenium w Javie lub Selenium w C#. Tylko do 23.09.2021 do godz. 21:00. Zapisz się tutaj.

Selenium Grid – prosta konfiguracja na Windows 10 i przeglądarkę Chrome

Selenium Grid to narzędzie będące częścią całego rozwiązania Selenium. Grid składa się z huba i node’ów (ewentualnie jednego node’a) i zarządza niejako testami decydując, na którym środowisku (nodzie) zostaną one wykonane. Decyzja ta dokonuje się w oparciu o capabilities przekazane do RemoteDrivera, czyli np. wersję systemu czy rodzaj przeglądarki. Co potrzeba, żeby skonfigurować sobie grida dla Windowsa i przeglądarki Chrome?

>> Chcesz wiedzieć więcej o Selenium Grid? Zobacz lekcję w ramach kursu Selenium do zera w Javie: Konfiguracja Selenium Grid.

Architektura Grida

Hub to maszyna, która jest centralnym punktem Grida. Otrzymuje żądania i dystrybuuje je pomiędzy node’y. Gdy hub otrzymuje żądanie wykonania testu np. na Windowsie 10 na przeglądarce Chrome, wyszuka wśród node’ów taki, który będzie odpowiadał tej specyfikacji. To właśnie na nim uruchomi testy (o ile takiego node’a znajdzie).
Node’y są np. maszynami testowymi o różnej kombinacji systemu operacyjnego, przeglądarki i innych parametrów.

Uruchomienie huba

Żeby uruchomić huba i node’y w Selenium Grid, potrzebujemy ściągnąć Selenium Server Standalone w postaci pliku *.jar. Można go ściągnąć z oficjalnej strony Selenium. Gdy już go mamy, wystarczy odpalić wiersz poleceń i posłużyć się poniższą komendą by postawić huba.  Hub zostanie odpalony na maszynie, na której komendę wykonujemy.

java -jar selenium-server-standalone-X.XX.X.jar -role hub

Po wykonaniu komendy w odpowiedzi powinniście zobaczyć coś takiego:

INFO [GridLauncherV3.launch] - Selenium build info: version: '3.14.0', revision: 'aacccce0'
INFO [GridLauncherV3$2.launch] - Launching Selenium Grid hub on port 4444
INFO::main: Logging initialized @954ms to org.seleniumhq.jetty9.util.log.StdErrLog
INFO [Hub.start] - Selenium Grid hub is up and running
INFO [Hub.start] - Nodes should register to http://<private_ip_address>:4444/grid/register/
INFO [Hub.start] - Clients should connect to http://<private_ip_address>:4444/wd/hub

Zamiast <private_ip_address> dostaniecie Wasz prywatny adres ip. W konsoli widać również informację gdzie mają się łączyć node’y, a gdzie mają się łączyć klienci (web drivery). Od tego momentu hub stoi na waszej lokalnej maszynie i wpisując w przeglądarkę localhost:4444 zobaczycie coś takiego:

A po kliknięciu na link console, zobaczycie na razie pustą konsolę ale po postawieniu node’a (lub kilku node’ów) tutaj właśnie zobaczymy ich konfigurację.

RemoteWebDriver

Do korzystania z Selenium Grid nie wystarczy nam zwykły obiekt ChromeDriver (lub driver innej przeglądarki), służący do lokalnego użycia Selenium. Do tego potrzebujemy obiektu klasy RemoteWebDriver. Klasa ta w Javie ma cztery konstruktory, my użyjemy tego chyba najczęściej wykorzystywanego:

RemoteWebDriver(java.net.URL remoteAddress, Capabilities capabilities)

Pierwszy parametr, remoteAddress, to nic innego jak adres, który wskazał nam hub, jako ten, z którym powinni się łączyć klienci. Capabilities to interfejs opisujący różne aspekty przeglądarki posługując się parami klucz/wartość. Ten interfejs jest implementowany przez kilka klas między innymi przez klasę DesiredCapabilities oraz ChromeOptions.

DesiredCapabilities

Rzut oka na metody tej klasy pozwala trochę lepiej zrozumieć czym to jest. Poniżej przykładowa prosta implementacja RemoteWebDrivera z użyciem DesiredCapabilities.

public class Driver {
    public static WebDriver getDriver() {
        //Stworzenie obiektu klasy DesiredCapabilities dla przeglądarki chrome
        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
        //[Opcjonalne]Ustawienie maszyny, na której chcemy żeby testy były wykonywane, na Windows 10
        //Używamy przy tym obiektu typu enum dostarczonego przez Selenium
        capabilities.setPlatform(Platform.WIN10);
        //[Opcjonalne]Ustawiamy nazwę przeglądarki
        capabilities.setBrowserName("chrome");
        WebDriver driver = null;
        try {
            driver = new RemoteWebDriver(new URL("https://<twój_prywatny_adres_ip>:4444/wd/hub"), capabilities);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return driver;
    }
}

Zarówno ustawienie platformy jak i nazwy przeglądarki jest opcjonalne. Te ustawienia służą później hubowi do ustalenia, na której maszynie powinny zostać odpalone testy.

Jak odpalicie test z tak stworzonym driverem, dostaniecie w konsoli (np. w IntelliJ) takie oto info:

INFO: Using `new ChromeOptions()` is preferred to `DesiredCapabilities.chrome()`

Pokażę Wam zatem jak zainicjalizować drivera używając ChromeOptions.

ChromeOptions

Przyjrzyjmy się jak wygląda użycie ChromeOptions:

public class Driver {
    public static WebDriver getDriver() {
        ChromeOptions options = new ChromeOptions();
        options.setCapability("platform", "WIN10");
        options.setCapability("browserName", "chrome");
        WebDriver driver = null;
        try {
            driver = new RemoteWebDriver(new URL("https://<twój_prywatny_adres_ip>:4444/wd/hub"), options);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return driver;
    }
}

Podobne, nie? Trzeba tylko wiedzieć wcześniej, co sobie możecie wrzucić do tych kluczy ustawiając np. nazwę przeglądarki. To sobie już znajdziecie w dokumentacji do Selenium Grida (link pod artykułem). Trochę o tych parametrach opowiem już teraz, bo przechodzimy do stworzenia node’a.

Uruchomienie node’a

Postawienie node’a w Selenium Grid wygląda podobnie jak w przypadku stawiania huba, tylko komenda jest inna:

java -Dwebdriver.chrome.driver=chromedriver.exe -jar selenium-server-standalone-X.XX.X.jar -role node -hub http://localhost:4444/grid/register -browser browserName=chrome,maxInstances=4

No to teraz po kolei co tu się podziało:

  • -Dwebdriver.chrome.driver=chromedriver.exe – służy do wskazania, gdzie leży chromedriver.exe; w tym przykładzie znajduje się on w tej samej lokalizacji jak ta, z której odpalamy skrypt;
  • -jar selenium-server-standalone-X.XX.X.jar -role node – odpalamy plik *.jar i mówimy, że maszyna na której wykonujemy skrypt będzie nodem;
  • -hub http://localhost:4444/grid/register – musimy powiedzieć node’owi, gdzie leży hub i gdzie się ma zarejestrować, żeby się z nim spiąć; jeżeli będziecie używać do tego różnych maszyn (a do tego właśnie Grid służy) to musicie tutaj podać adres ip, który zwrócił Wam hub,  gdy go odpaliliście;
  • -browser browserName=chrome,maxInstances=4 – tutaj możemy wrzucić jakieś ustawienia node’a pozwalające go później odróżnić od innych node’ów; hub użyje tych ustawień, żeby poprawnie rozdystrybuować testy.

MaxIntances mówi nam o tym ile instancji przeglądarki może być odpalonych równolegle – ma to zastosowanie w przypadku testów równoległych.

Domyślne ustawienia

Ustawienia po -browser są opcjonalne. Jeżeli nic tam nie podamy to dostaniemy domyślne ustawienia. Czyli jakie? Najprościej to sprawdzić odpalając poniższą komendę i zaglądając pod http://localhost:4444/grid/console (pamiętaj o wpisaniu adresu ip zamiast localhost jeżeli nie robisz tego lokalnie):

java -Dwebdriver.chrome.driver=chromedriver.exe -jar selenium-server-standalone-X.XX.X.jar -role node -hub http://localhost:4444/grid/register

W konsoli powinniście teraz zobaczyć:

[GridLauncherV3.launch] - Selenium build info: version: '3.14.0', revision: 'aacccce0'
[GridLauncherV3$3.launch] - Launching a Selenium Grid node on port 47271
:main: Logging initialized @669ms to org.seleniumhq.jetty9.util.log.StdErrLog
[SeleniumServer.boot] - Selenium Server is up and running on port 47271
[GridLauncherV3$3.launch] - Selenium Grid node is up and ready to register to the hub
[SelfRegisteringRemote$1.run] - Starting auto registration thread. Will try to register every 5000 ms.
[SelfRegisteringRemote.registerToHub] - Registering the node to the hub: http://localhost:4444/grid/register
[SelfRegisteringRemote.registerToHub] - The node is registered to the hub and ready to use

A pod http://localhost:4444/grid/console zobaczymy:

Czyli widać, że domyślne ustawienia to maksymalnie po pięć instancji Firefoxa i Chrome’a i jedna instancja IE. Po kliknięciu na zakładkę Configuration zobaczycie jeszcze kilka innych informacji:

Jednym z domyślnych ustawień jest maxSession: 5. Liczba ta oznacza maksymalną liczbę sesji na nodzie. Oznacza to np., że nie możemy mieć więcej niż 5 testów równolegle wykonujących się na tej maszynie w tym samym czasie. Jeżeli będzie ich więcej zostaną zakolejkowane albo rozdystrybuowane na inne maszyny. Zwróćcie uwagę, że każda z przeglądarek ma jeszcze swoje maxInstances. Tak jak już wcześniej pisałam, liczba ta mówi ile instancji przeglądarki może być odpalone w tym samym czasie. MaxSessions jest nadrzędne względem maxInstances, oznacza to, że nawet jeżeli pozwolimy na odpalanie 6 instancji Chrome równolegle ale maksymalna liczba sesji będzie ustawiona na 5, to nie uruchomi się więcej niż 5 instancji przeglądarki.

Jak widzicie platform, które my ustawiliśmy w testach na WIN10, tutaj ustawiło się samo bez naszej pomocy, bazując na faktycznej wersji systemu.

Dodatkowe ustawienia

Użyjmy jeszcze poniższego skryptu (nie zamykając poprzednio uruchomionych komend):

java -Dwebdriver.chrome.driver=chromedriver.exe -jar selenium-server-standalone-X.XX.X.jar -role node -hub http://localhost:4444/grid/register -browser browserName=chrome,maxInstances=3,testowyParametr=test

Ustawiłam tutaj dodatkowy parametr testowyParametr oraz maksymalna liczbę instancji przeglądarki na 3. Po uruchomieniu kolejnego node’a w konsoli grida mogę teraz zobaczyć:

Widać, że faktycznie maksymalna liczba instancji jest ustawiona na 3, a mój dodatkowy parametr pojawił się na liście parametrów i można go teraz użyć w metodzie setCapability, by jeszcze dokładniej wskazać, gdzie mają się odpalić testy np. podając wersję przeglądarki albo rozdzielczość ekranu na jakiej pracuje maszyna.

Linki

Selenium Server ma dużo więcej ustawień niż to, co tutaj pokazałam, dlatego w celu poszerzenia wiedzy polecam całkiem fajnie napisaną dokumentację do Selenium Grid.

https://github.com/SeleniumHQ/selenium/wiki/Grid2 – dokumentacja Grida

https://www.seleniumhq.org/download/ – Selenium Server Standalone do pobrania

>> Chcesz wiedzieć więcej o Selenium Grid? Zobacz lekcję w ramach kursu Selenium do zera w Javie: Konfiguracja Selenium Grid.

Dodaj komentarz:

 

    • Hej John, Niestety na chwilę obecną nie wiem. Ja w ramach kursu tworzenia testów automatycznych w Pythonie uczyłam się uruchamiania Grida tylko lokalnie.

      Odpowiedz