#dockerApps02 – Zalenium czyli alternatywa dla selenium grid – przykłady java i python.

Witajcie w tego typu wpisie, bęc !

https://youtu.be/Rx7v7a_vXDc

Wstęp

Jakiś czas temu stwierdziłem, że Selenium grid sprawuje się okej, ale musi być jakaś alternatywa.
Dużo ramu zjada, a właściwie tylko uruchamia nam nasza testy automatyczne, gdzie za bardzo nie mamy w nie wglądu bez ingerowania w kod testów, dla przykładu screenshoty. Jak wiecie na społeczność pasjonatów – zawsze można liczyć !!! Zelenium to nic innego jak opakowane w ładne pudełko Selenium hub, uwaga z VNC i jako jedynym VNC gdzie na żywo możemy wejść do odpowiedniego noda przeznaczonego na testy i klikać w nim.
Klikanie na zasadzie normalnej dystrybucji Linuxa. Możemy tam ręcznie sprawdzić czy np. nie trzeba wcześniej dodać hostów aplikacji lub inne kwestie konfiguracyjne. Przykładem może być np. w czasie problemów, gdy element, który nie chce się kliknąć przez puszczenie testów, możemy to zweryfikować ręcznym kliknięciem za pomocą tegoż VPNa. Ładny interface, domyślne chrome i Firefox. Wszystko prosto i przyjemnie. Możliwość korzystania z Docker Compose czy użycia gotowego skryptu za pomocą curla.

Oczywiście nie byłbym sobą gdybym nie pokazał tego na jakimś przykładzie.

Zaczynamy ! Warunki wstępne

Pierwszym warunkiem jaki trzeba spełnić jest posiadania dockera i komputera, który go wspiera wszystko znajdziecie w moim poprzednim wpisie https://gregkaqa.pl/index.php/2019/12/30/administracjadocker01-instalacja-dockera-na-systemie-windows/

Oraz posiłkujcie się wpisem dotyczącym zwykłego Selenium grid tutaj :
https://gregkaqa.pl/index.php/2020/01/07/dockerapps01-seleniumgrid-co-to-na-co-to-komu-dlaczego-w-dockerze/

Jako, że naszą bazą we wpisie o Selenium grid, był projekt Javy, więc kontynuujemy pokaz, bazując także na tym teście. A więc odpalamy Intelji, Docker Desktop. Docker się chwile odpala więc kilka słów o Zalenium.

https://github.com/zalando/zalenium

https://opensource.zalando.com/zalenium/

Seriooo ten projekt jest rozwijany przez tą markę z ciuchami 😀

https://otopress.pl/wp-content/uploads/2019/10/Zalando-696x464.jpg

Jak już wspomniałem na samym początku Zelenium to bardziej rozbudowany Selenium grid. Ciekawe jak się rozwiną kiedy Selenium 4 osiągnie status stable. Dobra nie chce mi się pisać czym jest Zalenium zaraz sami zobaczycie, a jeśli jesteście ciekawscy to już dawno weszliście w linki wyżej.

Instalacja i konfiguracja narzędzia :

Standardowo ten program to zamiennik cmd o nazwie Cmder 😀

Weryfikujemy czy Docker Desktop się odpalił.

 docker pull elgalu/selenium
 docker pull dosel/zalenium

Wklejamy oba polecenia pullujące niezbędne obrazy do działania Zalenium.

Standardowo czekamy na zakończenie pobierania.

To samo enter po pobraniu pierwszego, u mnie dość sporo czekania, ale może dlatego, że mam internet w LTE.

Jeśli się zakończyło wklejamy Docker ps i nic nie mamy !

Korzystając z przykładu po prostu wklejmy jak podali uruchamianie naszego Zalenium zatem wklejamy to :

docker run --rm -ti --name zalenium -p 4444:4444 ^
      -v /var/run/docker.sock:/var/run/docker.sock ^
      -v /c/Users/your_user_name/temp/videos:/home/seluser/videos ^
      --privileged dosel/zalenium start     

Wyskoczy nam, ze nie ma takiego katalogu przerabiamy to na samo /c/, ale analogicznie możecie stworzyć katalog i nie ma problemu 🙂

Na systemach gdzie jest podpięte konto ms pod wszystkim oknami wyskoczy info o logowaniu się na użytkownika lokalnego. I haslo z msa nie wchodzi jak sobie z tym poradzić, w menu start wpisujemy zarządzanie komputerem. I robimy to co na screenie pokazałem :)

CMD nie ogarnia kilku-lijnikowych skrytpów, czemu ? NIE WIEM ! 😀
Zatem najlepiej przekształcić to sobie w notatniku na jedną linie zatem :

docker run --rm -ti --name zalenium -p 4444:4444 ^ -v /var/run/docker.sock:/var/run/docker.sock ^ -v /c/users/grzegorz1/videos/:/home/seluser/videos ^ --privileged dosel/zalenium start

Zmieniacie sobie tylko -v tam wymagane ustawienie jakiegoś folderu do nagrań video.

Docker uruchamia Zalenium

Tak wygląda live preview. Zamiast localhost może być ip jeśli np. ogarniacie Dockera w innym miejscu niż swój komp, np. serwer lub laptop z Linuxem ? 🙂 Domyślny dostęp do niego to : http://localhost:4444/grid/admin/live

Widzimy na screenie domyślnie Zalenium ogarnął nam dwa nody, w których to są najważniejsze przeglądarki czyli ff i chrome, w swoich najnowszych wersjach. Co możemy robić na admin live ?

Po pierwsze live czyli przeglądanie na żywo pozwala na pogląd, tego co się dzieje z testami.
Następnie bezpośrednia interakcja poprzez użycie VPN u danego wirtualnego noda.
Do tego live posiada parametr, gdzie dopisując go do końca urla mamy możliwość, automatycznego odświeżania strony co podana liczba sekund.
?refresh=20 np. http://localhost:4444/grid/admin/live?refresh=20
Odświeży nam ta opcja stronę co 20 sekund 🙂
Jest też parametr build name oraz only active sesions, pierwsze to filtrowanie podglądu w oparciu o przekazywane capabilty z testów oraz drugie pokazywanie tylko aktywnych sesji, być może później to pokażę.

Zalenium sam przydziela nody.

Looknijmy na dwie opcje dotyczące danego noda, a więc :
Read-only-vpc oraz interact with VPC.

Wydajność na moim laptopie pozostawia wiele do życzenia, ale vpn nie jest po to by cały czas na nim siedzieć 🙂 Na pewno lepiej by to chodziło na osobnym serwerze np. Linuxowym 🙂

Configa nie musimy zmieniać z naszego projektu javy 🙂

Wy-szarzona przeglądarka oznacza sesję, która się dzieje lub już zadziała, najeżdżając na ów ikonkę widzimy informację, że zrobiła co miała zrobić i została usunięta.

Odświeżamy stronę za jakiś czas i już nasza przeglądarka jest gotowa do działania ponownie na tym danym nodzie 😛

Oke mam dwa nody wszystkie przeglądarki są dostępne więc super 🙂 spróbuje uruchomić naraz testy w javie i pythonie i uchwycić zrzut 😀

Jak widzimy poprzez wskazanie w testach tego samego urla do RemoteWebDriver co w SeleniumGrid czyli :
String RemoteURL = “http://localhost:4444/wd/hub/”;

Hub sam sobie ogarnia gdzie ma wysłać nasze testy dwa testy wysyłają żądanie rejestracji testów grid inteligentnie wyśle je do wolnego noda.
Zapewne jeśli puścimy 4 różne testy np. 2 ff i 2 chrome to powinno to zadziałać, acz nie wiem jak z wydajnością 🙁 :D, więc zawsze lepiej dołożyć noda.

Zalenium Dashboard

Na koniec pokażę jeszcze jeden element Zalenium a mianowicie – Dashboard. Url – > http://localhost:4444/dashboard/#, standardowo zamiast localhost może być ip maszyny, na której znajduje się Zalenium.

Tak się prezentuje historia po paru uruchomieniach testów.
Nie uświadczymy tam logów z testów albowiem, Zalenium udostępnia nam jedynie logi selenium i przeglądarki plus video jeśli włączymy taką opcje.

Dla przeglądarki Firefox wygląda to identycznie.

Ups zapomniałem powiedzieć, że niektóre propertiesy są domyślnie włączone ! 😀
Nic by nie przeszkadzało, ale nagrywanie video do katalogu, jest domyślnie na true ale to i lepiej ! 😀 Dlaczego ? Bo mogę wam pokazać zrzut z video, które się pomyślnie nagrało 🙂

Już wyłączyłem Zelenium i nic nie szkodzi w sumie.
Ale wiem dlaczego na screenie wyżej nie było video …
Firefox nie ogarnia filmików, czemu ? NIE WIEM !

Uruchamiając plik dashboard.html mamy dostęp do naszego dashboarda. Który to, zapisanego na nasz dysk 🙂
Jeśli zastopujemy Zelenium to dane przepadają, dashboard domyślnie ląduje tam gdzie wskazaliśmy video.
Nawet jeśli video property będzie na false, to wtedy mamy i tak dostęp do dashboarda tylko bez filmików z wykonania testów ! 🙂

Dobra to by było na tyle. Polecam wypróbować Zelenium, jeśli już używaliście Selenium Grid. Naprawdę spoczi narzędzie, w następnym wpisie tego typu bęc, będzie albo dalej o Zelenium, różne konfiguracje itp. albo o Selenoid. Dodatkowo we wpisach przyszłościowych warto będzie poruszyć temat Docker Swarm oraz Kubernetes.
Do na tyle trzymacie się do następnego !

Tradycyjnie kody źródłowe :

Tutaj Java :

import io.github.bonigarcia.wdm.WebDriverManager;
        import org.openqa.selenium.By;
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.chrome.ChromeDriver; //poprawnie zaimprtowało nam to z mavena
        import org.openqa.selenium.chrome.ChromeOptions;
        import org.openqa.selenium.firefox.FirefoxDriver;
        import org.openqa.selenium.remote.DesiredCapabilities;
        import org.openqa.selenium.remote.RemoteWebDriver;
        import org.testng.annotations.AfterSuite;
        import org.testng.annotations.BeforeSuite;
        import org.testng.annotations.Test;

        import java.net.MalformedURLException;
        import java.net.URL;

public class Test1 {
    /**/
    public WebDriver driver;
    public RemoteWebDriver drivero;
    public String RemoteURL = "http://localhost:4444/wd/hub/";
    public boolean chrome = true;

    /*adnotacja przed zestawie testów suite to zestaw testów robimy metode ktora cos robi przed testami*/
    @BeforeSuite
    public void przedTestami() throws MalformedURLException {
        if (chrome) {
            //WebDriverManager.chromedriver().avoidAutoVersion();
            //WebDriverManager.chromedriver().setup();
            //driver = new ChromeDriver();
            DesiredCapabilities capa = DesiredCapabilities.chrome();
            // ChromeOptions chrome = new ChromeOptions();
            capa.setBrowserName("chrome");
           // capa.setCapability("headless", false);
            drivero = new RemoteWebDriver(new URL(RemoteURL), capa);
        } else {
           /* WebDriverManager.firefoxdriver().avoidAutoVersion();
            WebDriverManager.firefoxdriver().setup();
            driver = new FirefoxDriver();*/
            DesiredCapabilities capa =  DesiredCapabilities.firefox();
            capa.setBrowserName("firefox");
           // capa.setCapability("headless", false);
           // capa.setCapability("version", "latest");

           // capa.setVersion("70.0");
            drivero = new RemoteWebDriver(new URL(RemoteURL), capa);
        }
    }

    /*adnotacja po zestawie testów suite to zestaw testów robimy metode ktora cos robi po testach*/
    @AfterSuite
    public void poTestach() {
        drivero.close();
    }

    /*właściwe testy*/
    @Test
    public void pierwszyTest() throws InterruptedException {
        //boolean chrome = false;
       /* driver.get("http://www.bing.com");
        driver.findElement(By.id("sb_form_q")).sendKeys("pogoda warszawa");
        driver.findElement(By.id("sb_form_go")).click();*/
        drivero.get("http://www.bing.com");
        drivero.findElement(By.id("sb_form_q")).sendKeys("pogoda warszawa");
        drivero.findElement(By.id("sb_form_go")).click();
        Thread.sleep(5000);
    }

    @Test
    public void drugiTest() throws InterruptedException {
        //boolean chrome = false;
        if (chrome) {
           /* driver.get("http://duckduckgo.com/");
            driver.findElement(By.id("search_form_input_homepage")).sendKeys("pogoda gdańsk");
            driver.findElement(By.id("search_button_homepage")).click();*/
            drivero.get("http://duckduckgo.com/");
            drivero.findElement(By.id("search_form_input_homepage")).sendKeys("pogoda gdańsk");
            drivero.findElement(By.id("search_button_homepage")).click();
            Thread.sleep(5000);
        }
    }
}

Tak wiem w pythonie nawet nie było wpisu numer dwa pokazującego RemoteWebDriver, będzie ! 😀 ale chciałem tu pokazać dwa niezależne testy, z dwóch różnych IDE.

Zaś tutaj python :

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
#driver = webdriver.Chrome(executable_path=r"C:\chromedriver.exe")

desiredCapabilities = DesiredCapabilities.CHROME.copy()
chromeOptionsRemote = webdriver.ChromeOptions()
chromeOptionsRemote.add_argument("--start-maximized")
chromeOptionsRemote.add_argument("--disable-session-crashed-bubble")

initRemoteDriver = webdriver.Remote(options=chromeOptionsRemote, command_executor='http://localhost:4444/wd/hub/', desired_capabilities=desiredCapabilities)
print(initRemoteDriver.current_url)


#driver = webdriver.Firefox(executable_path=r"C:\geckodriver.exe")
#driver.maximize_window()
webdriver.get("https://www.duckduckgo.com")
webdriver.delete_all_cookies()
title = webdriver.title
print(title)
assert title == "DuckDuckGo — Prywatność — jeszcze prostsza.", "Tytuł nie zgadza się z " + title

wpisz = webdriver.find_element_by_id("search_form_input_homepage")
szukaj = webdriver.find_element_by_id("search_button_homepage")
wpisz.send_keys("pogoda Lublin")
szukaj.click()
webdriver.save_screenshot("screnshot.png")
#driver.close()

Wpisy dotyczące ów kodów :
https://gregkaqa.pl/index.php/2020/01/12/automatyzacjapython01-narzedzia-pobieranie-konfiguracja-pierwszy-projekt/

oraz java :
https://gregkaqa.pl/index.php/category/automatyzacja/automatyzacja-java/

Napisz komentarz