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 | import org.openqa.selenium.chrome.ChromeDriver; |
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 | import org.openqa.selenium.devtools.v97.browser.Browser; |
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 domenieBrowser, która odpowiada za metody i zdarzenia związane z zarządzaniem przeglądarką - Klasa
org.openqa.selenium.devtools.{VERSION}.browser.Browserudostę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 | import org.openqa.selenium.devtools.v97.log.Log; |
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
- https://www.selenium.dev/documentation/webdriver/bidirectional/chrome_devtools/
- https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/devtools/package-summary.html
- https://chromedevtools.github.io/devtools-protocol/
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