
Witajcie w tego typu wpisie, bęc !
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 😀

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 :

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/