Sobes.tech
Middle
101
questionbank

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

AI答案

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