Наиболее распространенные шаблоны проектирования в тестировании

Page Object

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

Преимущества:

  • Облегчает обслуживание кода: Если изменится внешний вид или логика работы страницы, нужно будет вносить изменения только в соответствующий Page Object, а не в каждый тест.

  • Повышает читаемость тестов: Логика взаимодействия с элементами вынесена в методы объекта страницы, что делает тесты более читаемыми и понятными.

Пример:

class LoginPage:
    def __init__(self, driver):
        self.driver = driver
        self.username_field = "username"
        self.password_field = "password"
        self.login_button = "loginButton"

    def login(self, username, password):
        self.driver.find_element_by_id(self.username_field).send_keys(username)
        self.driver.find_element_by_id(self.password_field).send_keys(password)
        self.driver.find_element_by_id(self.login_button).click()

Page Factory

Page Factory - это паттерн, который расширяет концепцию Page Object, добавляя возможность автоматического инициализации элементов страницы. Он позволяет автоматизировать процесс инициализации элементов и делает код Page Object более модульным.

Преимущества:

  • Упрощает код: Использование Page Factory позволяет избавиться от дублирования кода и сделать его более чистым и модульным.

  • Снижает вероятность ошибок: Паттерн позволяет избежать ошибок, связанных с неправильным обращением к элементам страницы.

Пример:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class LoginPage:
    def __init__(self, driver):
        self.driver = driver
        self.username_field = (By.ID, "username")
        self.password_field = (By.ID, "password")
        self.login_button = (By.ID, "loginButton")

    def login(self, username, password):
        self.driver.find_element(*self.username_field).send_keys(username)
        self.driver.find_element(*self.password_field).send_keys(password)
        self.driver.find_element(*self.login_button).click()

    def is_login_page_loaded(self):
        return WebDriverWait(self.driver, 10).until(EC.presence_of_element_located(self.username_field))

Singleton

Singleton - это паттерн проектирования, который позволяет создавать только один экземпляр класса и предоставлять к нему глобальную точку доступа. В контексте автоматизации тестирования он может использоваться для создания единственного экземпляра WebDriver, который будет использоваться во всех тестах.

Преимущества:

  • Гарантирует наличие только одного экземпляра класса: Это позволяет избежать создания лишних экземпляров и экономит ресурсы.

  • Обеспечивает глобальный доступ: Экземпляр класса доступен из любой точки программы.

Пример:

from selenium import webdriver

class WebDriverSingleton:
    _instance = None

    @classmethod
    def get_instance(cls):
        if cls._instance is None:
            cls._instance = webdriver.Chrome()  # Или любой другой браузер
        return cls._instance

# Использование:
driver = WebDriverSingleton.get_instance()
driver.get("http://www.example.com")

Last updated