Sobes.tech
Middle

Was ist das Page Object Pattern?

sobes.tech KI

Antwort von AI

Das Page Object (PO)-Muster ist ein Entwurfsmuster für die Automatisierungstests von Webschnittstellen, das Webseiten als Klassen darstellt. Jede PO-Klasse kapselt die Elemente und Aktionen, die der Benutzer auf einer bestimmten Seite ausführt.

Vorteile der Verwendung:

  • Lesbarkeit: Der Testcode wird verständlicher, da er mit den Seiten und deren Elementen über High-Level-Methoden interagiert.
  • Wartbarkeit: Bei Änderungen an den Element-Lokatoren auf der Seite müssen nur die entsprechenden Page-Object-Klassen angepasst werden, ohne die Tests zu ändern.
  • Wiederverwendbarkeit: Methoden und Elemente des Page Object können in verschiedenen Testszenarien genutzt werden.
  • Aufgabentrennung: Die Logik der Interaktion mit UI-Elementen ist von der Testlogik getrennt.

Hauptkomponenten:

  • Seitenklassen: Stellen eine Abstraktion einer konkreten Webseite dar.
  • Web-Elemente: Werden innerhalb der Seitenklasse mit Lokatoren (XPath, CSS-Selektoren, ID usw.) definiert.
  • Methoden: Repräsentieren Aktionen, die auf der Seite ausgeführt werden können (z.B. login(), addToCart(), search()). Diese Methoden interagieren mit den Web-Elementen.

Beispielstruktur:

# 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 für das Eingabefeld für den Benutzernamen
        self.password_input = (By.ID, "password")  # Locator für das Eingabefeld für das Passwort
        self.login_button = (By.XPATH, "//button[contains(text(), 'Login')]") # Locator für den Login-Button
        self.error_message = (By.CSS_SELECTOR, ".error-message") # Locator für die Fehlermeldung

    def open(self, url):
        self.driver.get(url) # Öffnet die Seite

    def enter_credentials(self, username, password):
        self.driver.find_element(*self.username_input).send_keys(username) # Gibt den Benutzernamen ein
        self.driver.find_element(*self.password_input).send_keys(password) # Gibt das Passwort ein

    def click_login_button(self):
        self.driver.find_element(*self.login_button).click() # Klickt auf den Login-Button

    def get_error_message(self):
        return self.driver.find_element(*self.error_message).text # Holt den Text der Fehlermeldung
# test_login.py
import unittest
from selenium import webdriver
from login_page import LoginPage # Import der Page Object-Klasse

class LoginTests(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome() # Initialisiert den WebDriver
        self.login_page = LoginPage(self.driver) # Erstellt eine Instanz des Page Objects

    def tearDown(self):
        self.driver.quit() # Schließt den WebDriver

    def test_valid_login(self):
        self.login_page.open("http://example.com/login") # Öffnet die Seite
        self.login_page.enter_credentials("valid_user", "valid_password") # Gibt die Daten ein
        self.login_page.click_login_button() # Klickt auf den Button
        # Zusätzliche Überprüfungen nach erfolgreichem Login

    def test_invalid_login(self):
        self.login_page.open("http://example.com/login") # Öffnet die Seite
        self.login_page.enter_credentials("invalid_user", "wrong_password") # Gibt die Daten ein
        self.login_page.click_login_button() # Klickt auf den Button
        error_text = self.login_page.get_error_message() # Holt den Fehlertext
        self.assertIn("Ungültige Anmeldedaten", error_text) # Überprüft die Fehlermeldung

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

Dieses Beispiel zeigt, wie LoginPage als Page Object für die Login-Seite dient. Die Tests in test_login.py verwenden die Methoden dieser Klasse, um die Interaktion zu abstrahieren.

Das Page Object Muster ist ein De-facto-Standard in der Automatisierung von Web-Interface-Tests, das durch seine Vorteile in Wartbarkeit und Lesbarkeit geprägt ist.