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:

  1. Wejdź na stronę http://automationpractice.com/index.php
  2. Wyszukaj po słowie „Yellow” produkty w sklepie
  3. Dodaj do koszyka drugi wyszukany element z listy
  4. Przejdź do koszyka
  5. 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:

Paczki Nuget projektu
  • 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...
Czas wykonania to kolejno (w sekundach): 18.7; 18.0; 16.7; 16.3; 16.4:

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://*).