Co zrobimy
W tym artykule spróbujemy wyłączyć przy pomocy CDP pobieranie wszystkich plików z obrazkami i porównać czas trwania testów na stronie sklepu internetowego.
Nowinki w Selenium 4.0 warte uwagi (pełna lista tutaj):
- Wsparcie dla CDP (Chrome Devtools Protocol)
- Przejście na protokół W3C
- Wsparcie dla relatywnych lokatorów (above, below, leftOf, rightOf, near)
- Lepsze screenshoty i zarządzanie zakładkami
Przygotowanie projektu
Będziemy potrzebować Selenium 4.0 (użyjemy wersji .net core 3+ oraz języka C#). Jako IDE używać będę Visual Studio 2019.
Wzorzec BlackHole Proxy Pattern jest możliwy do zastosowania w dowolnym języku programowania, ponieważ implementacja opiera się na DevTools Api, którego obsługa jest wspierana właśnie od Selenium 4.0
Zacznijmy od zwykłego testu, przy użyciu nUnita i Selenium. Jako stronę benchmarkową użyję http://automationpractice.com/index.php a kroki testu będą wyglądać jak poniżej:
- Wejdź na stronę http://automationpractice.com/index.php
- Wyszukaj po słowie „Yellow” produkty w sklepie
- Dodaj do koszyka drugi wyszukany element z listy
- Przejdź do koszyka
- Zrób screenshot z koszyka
Czas na kod aplikacji, instalujemy następujące paczki nugetowe (musimy włączyć „prerelease” żeby zainstalować Selenium WebDriver w wersji alpha:

- Selenium.WebDriver (wersja 4.0 alpha),
- Selenium.WebDriver.ChromeDriver
- NUnit
- NUnitTestAdapter
Czas na kod
Teraz kod testu. Na potrzeby tego artykułu pominąłem opis pisania PageObjectów (pełne repozytorium znajduje się tutaj). Nas interesuje czas wykonania testów (porównaniem „normalnego” testu i testu z wyłączonym pobieraniem plików *.jpg oraz *.png).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | using BlackHoleProxyPattern.Pages; using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.DevTools; using OpenQA.Selenium.DevTools.Network; namespace BlackHoleProxyPattern { public class SeleniumBlackHoleProxyTest { private IWebDriver driver; [SetUp] public void Setup() { driver = new ChromeDriver(); IDevTools devTools = driver as IDevTools; var session = devTools.CreateDevToolsSession(); var blockedUrlSettings = new SetBlockedURLsCommandSettings(); blockedUrlSettings.Urls = new string[] { "*://*.jpg", "*://*.png", }; session.Network.Enable(new EnableCommandSettings()); session.Network.SetBlockedURLs(blockedUrlSettings); driver.Manage().Window.Maximize(); driver.Navigate().GoToUrl("http://automationpractice.com/"); } [Test] public void TestFunctionalityWithBlockedImages() { var homePage = new HomePage(driver); homePage.SearchProduct("Yellow"); var resultsPage = new ResultsPage(driver); resultsPage.SelectNthProduct(2); var productPage = new ProductPage(driver); productPage.AddProductToCart(); productPage.ProceedToCheckout(); Screenshot ss = ((ITakesScreenshot)driver).GetScreenshot(); ss.SaveAsFile("screenshot.png", ScreenshotImageFormat.Png); } [TearDown] public void TearDown() { driver.Quit(); } } } |
Wyniki
Czasy wykonań dla wyłączonego ładowania obrazków kolejno (w sekundach): 13.5; 11.9; 12.4; 12.8; 15.1
Po wyłączeniu blokady obrazków (zakomentowana tablica stringów)
1 | blockedUrlSettings.Urls = new... |
Ciekawostka: wyłączenie obrazków powoduje inny flow działania aplikacji. Aby test przeszedł dla wyłączonych obrazków trzeba zakomentować krok:
1 | productPage.AddProductToCart(); |
Oprócz wyłączenia obrazków, możemy wyłączyć JavaScript, pobieranie plików .css i blokować dowolne domeny używając wildcardów (np. analitykę blokując domenę *.google.com). Możemy również zablokować jakiś protokół (np: http://*).