Sobes.tech
Middle

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

sobes.tech AI

Отговор от AI

Моделът Page Object (PO) е шаблон за дизайн за автоматизирано тестване на уеб интерфейси, който представя уеб страниците като класове. Всеки клас PO капсулира елементите и действията, извършвани от потребителя на конкретна страница.

Предимства на използването:

  • Четливост: Тестовият код става по-лесен за разбиране, тъй като взаимодейства със страниците и техните елементи чрез високоуровневи методи.
  • Поддържане: При промяна на локаторите на елементите на страницата, е достатъчно да се направят корекции само в съответния клас Page Object, без да се преписват тестовете, използващи тези елементи.
  • Повторна употреба: Методи и елементи на Page Object могат да бъдат използвани в различни тестови сценарии.
  • Разделяне на отговорностите: Логиката за взаимодействие с UI е отделена от логиката на тестовия сценарий.

Основни компоненти:

  • Класове на страници: Представляват абстракция на конкретна уеб страница.
  • Уеб елементи: Определят се в класа на страницата с помощта на локатори (XPath, CSS селектори, ID и др.).
  • Методи: Представляват действия, които могат да се изпълнят на страницата (например, login(), addToCart(), search()). Тези методи взаимодействат с уеб елементите.

Примерна структура:

# 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[contains(text(), 'Login')]") # Локатор за бутона за вход
        self.error_message = (By.CSS_SELECTOR, ".error-message") # Локатор за съобщението за грешка

    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 е стандарт в автоматизацията на тестове за уеб интерфейси поради своите предимства по отношение на поддръжка и четливост.