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.