Sobes.tech
Middle

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

sobes.tech AI

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

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

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

  • Αναγνωσιμότητα: Ο κώδικας δοκιμής γίνεται πιο κατανοητός, καθώς αλληλεπιδρά με τις σελίδες και τα στοιχεία τους μέσω υψηλού επιπέδου μεθόδων.
  • Συντηρησιμότητα: Όταν αλλάζουν οι locator των στοιχείων στη σελίδα, αρκεί να γίνουν αλλαγές μόνο στην αντίστοιχη κλάση Page Object, χωρίς να χρειάζεται να ξαναγραφούν τα τεστ που χρησιμοποιούν αυτά τα στοιχεία.
  • Επαναχρησιμοποίηση: Οι μέθοδοι και τα στοιχεία του Page Object μπορούν να χρησιμοποιηθούν σε διάφορα σενάρια δοκιμών.
  • Διαχωρισμός ευθυνών: Η λογική αλληλεπίδρασης με τα στοιχεία UI διαχωρίζεται από τη λογική του σεναρίου δοκιμής.

Βασικά συστατικά:

  • Κλάσεις σελίδων: Αναπαριστούν μια συγκεκριμένη ιστοσελίδα.
  • Στοιχεία web: Ορίζονται μέσα στην κλάση της σελίδας χρησιμοποιώντας locators (XPath, CSS selectors, ID κ.ά.).
  • Μέθοδοι: Αναπαριστούν τις ενέργειες που μπορούν να εκτελεστούν στη σελίδα (π.χ., login(), addToCart(), search()). Αυτές οι μέθοδοι αλληλεπιδρούν με τα web στοιχεία.

Παραδείγματα δομής:

# 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 πεδίου εισαγωγής ονόματος χρήστη
        self.password_input = (By.ID, "password")  # Locator πεδίου εισαγωγής κωδικού
        self.login_button = (By.XPATH, "//button[contains(text(), 'Login')]") # Locator κουμπιού εισόδου
        self.error_message = (By.CSS_SELECTOR, ".error-message") # Locator μηνύματος σφάλματος

    def open(self, url):
        self.driver.get(url) # Άνοιγμα σελίδας

    def enter_credentials(self, username, password):
        self.driver.find_element(*self.username_input).send_keys(username) # Εισαγωγή ονόματος χρήστη
        self.driver.find_element(*self.password_input).send_keys(password) # Εισαγωγή κωδικού

    def click_login_button(self):
        self.driver.find_element(*self.login_button).click() # Κλικ στο κουμπί εισόδου

    def get_error_message(self):
        return self.driver.find_element(*self.error_message).text # Λήψη κειμένου μηνύματος σφάλματος
# test_login.py
import unittest
from selenium import webdriver
from login_page import LoginPage # Εισαγωγή της κλάσης Page Object

class LoginTests(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome() # Αρχικοποίηση οδηγού
        self.login_page = LoginPage(self.driver) # Δημιουργία στιγμιότυπου Page Object

    def tearDown(self):
        self.driver.quit() # Τερματισμός οδηγού

    def test_valid_login(self):
        self.login_page.open("http://example.com/login") # Άνοιγμα σελίδας
        self.login_page.enter_credentials("valid_user", "valid_password") # Εισαγωγή δεδομένων
        self.login_page.click_login_button() # Κλικ στο κουμπί
        # Επιπλέον ελέγχοι μετά την επιτυχή σύνδεση

    def test_invalid_login(self):
        self.login_page.open("http://example.com/login") # Άνοιγμα σελίδας
        self.login_page.enter_credentials("invalid_user", "wrong_password") # Εισαγωγή δεδομένων
        self.login_page.click_login_button() # Κλικ στο κουμπί
        error_text = self.login_page.get_error_message() # Λήψη κειμένου σφάλματος
        self.assertIn("Λάθος όνομα χρήστη ή κωδικός", error_text) # Έλεγχος μηνύματος σφάλματος

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

Σε αυτό το παράδειγμα, το LoginPage αντιπροσωπεύει ένα Page Object για τη σελίδα σύνδεσης. Τα τεστ στο test_login.py χρησιμοποιούν τις μεθόδους αυτής της κλάσης, αποφεύγοντας την άμεση αλληλεπίδραση με τα στοιχεία.

Το μοτίβο Page Object αποτελεί το de-facto πρότυπο στην αυτοματοποίηση δοκιμών διαδικτυακών διεπαφών λόγω των πλεονεκτημάτων του στην υποστήριξη και την αναγνωσιμότητα.