Sobes.tech
Middle

Τι είναι το μοτίβο Page Object;

sobes.tech AI

Απάντηση από AI

Το μοτίβο Page Object είναι ένα πρότυπο σχεδίασης που χρησιμοποιείται για τη βελτίωση της αναγνωσιμότητας, της συντηρησιμότητας και της μείωσης της διπλοτυπίας κώδικα στην αυτοματοποίηση δοκιμών web εφαρμογών. Είναι μια αντικειμενοστραφής προσέγγιση όπου κάθε σελίδα (ή σημαντική συνιστώσα) της web εφαρμογής αντιπροσωπεύεται από μια ξεχωριστή κλάση.

Βασικές ιδέες του Page Object:

  • Ενσωμάτωση των στοιχείων της σελίδας και των ενεργειών που μπορούν να εκτελεστούν με αυτά.
  • Διαχωρισμός των εντοπιστών στοιχείων και της επιχειρηματικής λογικής των δοκιμών.
  • Παροχή μιας API υψηλού επιπέδου για αλληλεπίδραση με τη σελίδα.

Πλεονεκτήματα της χρήσης του Page Object:

  • Βελτίωση της αναγνωσιμότητας των δοκιμών: Οι δοκιμές γίνονται πιο δηλωτικές, περιγράφοντας τα βήματα αλληλεπίδρασης με το περιβάλλον χρήστη σε επιχειρηματική γλώσσα.
  • Βελτίωση της συντηρησιμότητας: Όταν αλλάζει το UI (π.χ., ο εντοπιστής ενός στοιχείου), αρκεί να γίνει η αλλαγή σε μια μόνο κλάση Page Object, και όχι σε κάθε δοκιμή που χρησιμοποιεί αυτό το στοιχείο.
  • Μείωση της διπλοτυπίας κώδικα: Οι κοινές ενέργειες με τη σελίδα ενσωματώνονται σε μεθόδους του Page Object και μπορούν να επαναχρησιμοποιηθούν σε διάφορες δοκιμές.
  • Αύξηση της σταθερότητας των δοκιμών: Χάρη στην αφαίρεση των λεπτομερειών υλοποίησης UI.

Παράδειγμα δομής:

Ας υποθέσουμε ότι έχουμε μια σελίδα σύνδεσης. Μπορούμε να δημιουργήσουμε μια κλάση LoginPage.

# 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")
        self.password_input = (By.ID, "password")
        self.login_button = (By.XPATH, "//button[text()='Login']")

    def set_username(self, username):
        self.driver.find_element(*self.username_input).send_keys(username)

    def set_password(self, password):
        self.driver.find_element(*self.password_input).send_keys(password)

    def click_login(self):
        self.driver.find_element(*self.login_button).click()

    def login(self, username, password):
        self.set_username(username)
        self.set_password(password)
        self.click_login()

Χρήση στο τεστ:

# test_login.py
import unittest
from selenium import webdriver
from login_page import LoginPage

class LoginTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get("http://example.com/login")

    def test_valid_login(self):
        login_page = LoginPage(self.driver)
        login_page.login("valid_user", "valid_password")
        # Έλεγχος επιτυχούς σύνδεσης

    def tearDown(self):
        self.driver.quit()

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

Εδώ, η κλάση LoginPage ενσωματώνει τους εντοπιστές και τις ενέργειες που σχετίζονται με τη σελίδα σύνδεσης. Το τεστ test_valid_login αλληλεπιδρά με το LoginPage μέσω μεθόδων υψηλού επιπέδου όπως το login. Αν αλλάξει ο εντοπιστής του πεδίου χρήστη, αρκεί να τροποποιηθεί μόνο στην LoginPage.