Selenium 4 - Chrome DevTools Protocol

Chrome DevTools Protocol (CDP) dostarcza niskopoziomowy interfejs, który pozwala między innymi na inspekcję i kontrolę dokumentów, instrumentację przeglądarki, czy symulację interakcji użytkownika wykorzystywaną w automatyzacji. CDP dostarcza również możliwość nasłuchiwania na określone zdarzenia, takie jak zdarzenia sieciowe czy zdarzenia związane z logami w konsoli.

Wiele bibliotek i rozszerzeń wykorzystuje ten protokół do orkiestracji akcji w przeglądarkach Chromium, Chrome czy Edge. Do grona tych narzędzi należy również Selenium, które wraz z czwartym wydaniem wprowadziło wsparcie dla tego protokołu w sterownikach ChromeDriver, EdgeDriver, jak również FirefoxDriver.

Dostęp do Chrome DevTools Protocol w Selenium 4

Chrome DevTools Protocol dostępny jest poprzez interfejs HasDevTools, który implementowany jest przez sterowniki ChromeDriver, EdgeDriver i FirefoxDriver. Interfejs ten pozwala na dostęp do obiektu DevTools, który wykorzystany będzie do interakcji z protokołem CDP przeglądarki:

1
2
3
4
5
6
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;

ChromeDriver driver = new ChromeDriver();
DevTools devTools = driver.getDevTools();
devTools.createSession();

Po utworzeniu sesji, obiekt DevTools posłuży do wysyłania komend protokołu CDP.

Wykonanie komendy

Metoda send jako argument przyjmuje generyczny obiekt typu org.openqa.selenium.devtools.Command<X>, który reprezentuje konkretną komendę protokołu CDP:

1
2
3
4
5
import org.openqa.selenium.devtools.v97.browser.Browser;

Browser.GetVersionResponse response = devTools.send(Browser.getVersion());
System.out.println(response.getUserAgent());
System.out.println(response.getProduct());

W celu zlokalizowania dostępnych komend najlepiej użyć dokumentacji protokołu CDP, a następnie zlokalizować odpowiednią klasę dostarczającą wybraną komendę.

Przykład:

  • Komenda Browser.getVersion - dostępna jest w domenie Browser, która odpowiada za metody i zdarzenia związane z zarządzaniem przeglądarką
  • Klasa org.openqa.selenium.devtools.{VERSION}.browser.Browser udostępnia statyczne metody zwracające odpowiednie komendy w tej domenie: org.openqa.selenium.devtools.v97.browser.Browser#getVersion
  • Odpowiedź, czyli Browser.GetVersionResponse, wynika z typu zwracanego przez metodę getVersion

Nasłuchiwanie na wybrane zdarzenia

Poza wykonywaniem komend, CDP umożliwa nasłuchiwanie na zdarzenia takie jak:

  • Zdarzenia console.log
  • Wyjątki JavaScript
  • Zdarzenia sieciowe
  • Metryki wydajnościowe

W celu obsługi wybranych zdarzeń należy włączyć obsługę zdarzeń dla danej domeny (metoda enable) oraz zarejestrować obiekt nasłuchujący na zdarzenia za pomocą metody addListener dostępnej w obiekcie DevTools. Metoda addListener przyjmuje dwa argumenty: typ zdarzenia oraz obiekt konsumujący dane zdarzenie będący implementacją standardowego interfejsu funkcyjnego Consumer:

1
2
3
4
5
6
7
8
9
10
11
12
13
import org.openqa.selenium.devtools.v97.log.Log;
import org.openqa.selenium.devtools.v97.log.model.LogEntry;

devTools.send(Log.enable());

Consumer<LogEntry> logEntryConsumer = logEntry -> {
System.out.println(logEntry.getLevel());
System.out.println(logEntry.getText());
};

devTools.addListener(Log.entryAdded(), logEntryConsumer);

driver.get("https://the-internet.herokuapp.com/broken_images");

Typ zdarzenia reprezentowany jest przez generyczny obiekt org.openqa.selenium.devtools.Event<X> i podobnie jak w przypadku komend, w celu zlokalizowania dostępnych zdarzeń najlepiej użyć dokumentacji protokołu CDP, a następnie zlokalizować odpowiednią klasę dostarczającą wybrane zdarzenia.

Podsumowanie

Protokół Chrome DevTools Protocol rozwija się i dostarcza coraz więcej możliwości inspekcji dokumentów, instrumentacji przeglądarki, czy symulacji interakcji użytkownika. Do ciekawych możliwości, które można wykorzystać w testach automatycznych, zaliczyłbym możliwość nasłuchiwania na zdarzenia protokołu HTTP i możliwość modyfikacji żądań czy odpowiedzi, weryfikację logów z konsoli JavaScript, czy w końcu możliwość emulacji urządzeń mobilnych w testach automatycznych opartych o Selenium.

Dokumentacja

Repozytorium Git projektu

Jeżeli chcesz spróbować swoich sił z Selenium 4, możesz użyć gotowego szablonu dla projektu, który znajduje się w repozytorium Git: https://gitlab.com/qalabs/blog/junit5-selenium-gradle-template

Rafał Borowiec

Nazywam się Rafał Borowiec. Jestem w branży IT od ponad 10 lat, przygodę rozpoczynałem jako tester oprogramowania. Oprócz testowania oprogramowania i zapewniania jakości, specjalizuję się w wytwarzaniu oprogramowania oraz zarządzaniu projektami i zespołami. Chętnie dzielę się wiedzą, prowadzę blog dotyczący programowania, jestem wykładowcą oraz trenerem IT.