Czym są wzorce projektowe i dlaczego warto je stosować? Dowiecie się tego tutaj: Wzorce projektowe – jak ogarnąć automatyzację testów i nie zginąć w chaosie.

Natomiast przypominając lub w ramach uzupełnienia, jeśli nie czytaliście poprzedniego artykułu, oto krótkie wyjaśnienie dwóch ważnych pojęć:

  • Wzorzec projektowy to sprawdzone rozwiązanie często powtarzających się problemów w tworzeniu oprogramowania. Pomaga uporządkować kod, ułatwia jego utrzymanie i sprawia, że jest bardziej czytelny, dzięki czemu praca staje się bardziej efektywna i mniej chaotyczna.
  • Page Object Model (POM) to jeden z takich wzorców, używany w automatyzacji testów. Polega na tworzeniu oddzielnych „klas”, które opisują poszczególne strony lub ich elementy. Dzięki temu zmiany w interfejsie trzeba wprowadzać tylko w jednym miejscu, co ułatwia zarządzanie testami i zwiększa ich stabilność.

Ten kod to przykład implementacji Page Object Model (POM) w Selenium, który służy do automatyzacji testów stron internetowych.

 public class Login
    {
        private readonly IWebDriver _driver;

        // Define the locators for the elements on the login page
        private By usernameField = By.Id("user-name");
        private By passwordField = By.Id("password");
        private By loginButton = By.Id("login-button");
        private By errorMessageContainer = By.CssSelector("h3[data-test='error']");

        // Constructor to initialize the WebDriver
        public Login(IWebDriver driver)
        {
            _driver = driver;
        }

        // Method to enter the username
        public void EnterUsername(string username) => _driver.FindElement(usernameField).SendKeys(username);

        // Method to enter the password
        public void EnterPassword(string password) => _driver.FindElement(passwordField).SendKeys(password);

        // Method to click the login button
        public void ClickLoginButton() => _driver.FindElement(loginButton).Click();

        // Method to perform the login action
        public void LoginToApplication(string username, string password)
        {
            EnterUsername(username);
            EnterPassword(password);
        }
        
    }

Co tu się dzieje?

  • Klasa Login reprezentuje stronę logowania w aplikacji internetowej, implementując wzorzec Page Object Model (POM) w Selenium.
  • Sterownik WebDriver – W konstruktorze przyjmujemy instancję IWebDriver, dzięki której wykonujemy wszystkie akcje na stronie.
  • Lokalizatory elementów – Pola prywatne By przechowują selektory do najważniejszych elementów strony logowania:
    • pole użytkownika (usernameField),
    • pole hasła (passwordField),
    • przycisk logowania (loginButton),
    • kontener wiadomości o błędzie (errorMessageContainer).
  • Metody:
    • EnterUsername(string username) — wpisuje podany login
    • EnterPassword(string password) — wpisuje hasło,
    • ClickLoginButton() — klika przycisk logowania.

Dlaczego tak?

  • POM pomaga utrzymać porządek: wszystkie elementy i akcje związane z konkretną stroną są w jednym miejscu.
  • Testy są czytelniejsze: w testach możesz po prostu wywołać np. registrationPage.enterEmail('test@example.com') zamiast powtarzać selektory i metody.
  • Łatwość utrzymania: jeśli zmieni się wygląd strony (np. zmieni się selektor pola e-mail), poprawiasz go tylko tutaj, a nie w każdym teście.

Dlaczego tak?

  • POM pomaga utrzymać porządek: wszystkie elementy i akcje związane z konkretną stroną są w jednym miejscu.
  • Testy są czytelniejsze: w testach możesz po prostu wywołać np. _loginPage.LoginToApplication(login, password) zamiast powtarzać selektory i metody.
  • Łatwość utrzymania: jeśli zmieni się wygląd strony (np. zmieni się selektor pola e-mail), poprawiasz go tylko tutaj, a nie w każdym teście.