Sobes.tech
Middle
86
questionbank

Что такое паттерн Page Object?

Ответ от нейросети

sobes.tech AI

Паттерн Page Object — это шаблон проектирования, используемый для повышения читаемости, поддерживаемости и сокращения дублирования кода в тест-автоматизации веб-приложений. Он представляет собой объектно-ориентированный подход, где каждая страница (или значимый компонент) веб-приложения представлена отдельным классом.

Основные идеи Page Object:

  • Инкапсуляция элементов страницы и действий, которые можно с ними выполнять.
  • Разделение локаторов элементов и бизнес-логики тестов.
  • Предоставление высокоуровневого API для взаимодействия со страницей.

Преимущества использования Hаge 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. Если локатор поля username изменится, нам нужно будет изменить его только в LoginPage.