Sobes.tech
Middle

Какво е патърнът Page Object?

sobes.tech AI

Отговор от AI

Моделът Page Object е шаблон за дизайн, използван за подобряване на четливостта, поддържането и намаляване на дублирането на код в автоматизацията на тестове за уеб приложения. Той представлява обектно-ориентиран подход, при който всяка страница (или важен компонент) на уеб приложението е представена чрез отделен клас.

Основни идеи на 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_button(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_button()

Използване в тест:

# 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.