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