Sobes.tech
Middle

Wat is het Page Object-patroon?

sobes.tech AI

Antwoord van AI

Het Page Object (PO) patroon is een ontwerppatroon voor het automatiseren van tests van webinterfaces, dat webpagina's voorstelt als klassen. Elke PO-klasse kapselt de elementen en acties die door de gebruiker op een specifieke pagina worden uitgevoerd.

Voordelen van gebruik:

  • Leesbaarheid: De testcode wordt begrijpelijker omdat deze via high-level methoden interactie heeft met pagina's en hun elementen.
  • Onderhoudbaarheid: Bij wijzigingen in de locator van elementen op de pagina, hoeft alleen de betreffende Page Object-klasse aangepast te worden, zonder de tests die deze elementen gebruiken te herschrijven.
  • Herbruikbaarheid: Methodes en elementen van het Page Object kunnen in verschillende testscenario's gebruikt worden.
  • Verantwoordelijkheden scheiding: De logica voor interactie met UI-elementen is gescheiden van de testscenario-logica.

Belangrijke componenten:

  • Pagina klassen: Representeren een abstractie van een specifieke webpagina.
  • Web-elementen: Worden binnen de pagina-klasse gedefinieerd met behulp van locatoren (XPath, CSS-selectors, ID, etc.).
  • Methoden: Representeren acties die op de pagina uitgevoerd kunnen worden (bijvoorbeeld login(), addToCart(), search()). Deze methoden interageren met web-elementen.

Structuurvoorbeeld:

# login_page.py
from selenium.webdriver.common.by import By

class LoginPage:

    def __init__(self, driver):
        self.driver = driver
        self.username_input = (By.ID, "username")  # Locator voor gebruikersnaam invoerveld
        self.password_input = (By.ID, "password")  # Locator voor wachtwoord invoerveld
        self.login_button = (By.XPATH, "//button[contains(text(), 'Login')]") # Locator voor login knop
        self.error_message = (By.CSS_SELECTOR, ".error-message") # Locator voor foutmelding

    def open(self, url):
        self.driver.get(url) # Opent de pagina

    def enter_credentials(self, username, password):
        self.driver.find_element(*self.username_input).send_keys(username) # Voert gebruikersnaam in
        self.driver.find_element(*self.password_input).send_keys(password) # Voert wachtwoord in

    def click_login_button(self):
        self.driver.find_element(*self.login_button).click() # Klikt op login knop

    def get_error_message(self):
        return self.driver.find_element(*self.error_message).text # Haalt de foutmelding op
# test_login.py
import unittest
from selenium import webdriver
from login_page import LoginPage # Importeer de Page Object klasse

class LoginTests(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome() # Initialiseer WebDriver
        self.login_page = LoginPage(self.driver) # Maak een instantie van de Page Object

    def tearDown(self):
        self.driver.quit() # Sluit WebDriver

    def test_valid_login(self):
        self.login_page.open("http://example.com/login") # Open de pagina
        self.login_page.enter_credentials("valid_user", "valid_password") # Voer gegevens in
        self.login_page.click_login_button() # Klik op login knop
        # Extra controles na succesvolle login

    def test_invalid_login(self):
        self.login_page.open("http://example.com/login") # Open de pagina
        self.login_page.enter_credentials("invalid_user", "wrong_password") # Voer gegevens in
        self.login_page.click_login_button() # Klik op login knop
        error_text = self.login_page.get_error_message() # Haal foutmelding op
        self.assertIn("Ongeldige inloggegevens", error_text) # Controleer foutmelding

if __name__ == "__main__":
    unittest.main()

In dit voorbeeld vertegenwoordigt LoginPage een Page Object voor de loginpagina. Tests in test_login.py gebruiken de methoden van deze klasse, abstractie van de details van interactie met elementen.

Het Page Object patroon is een de-facto standaard in webinterface-testautomatisering vanwege de voordelen in onderhoudbaarheid en leesbaarheid.