Page Object: принципы, примеры и лучшие практики
Page Object - это шаблон проектирования в автоматизации тестирования, который помогает создавать поддерживаемые и удобочитаемые тесты. Он позволяет абстрагировать логику каждой страницы в отдельный класс, который содержит все элементы управления и действия, доступные на этой странице.
Page Object включает в себя следующие элементы:
1. Локаторы - это селекторы, которые используются для идентификации элементов управления на странице. Локаторы можно использовать для поиска элементов с помощью CSS селекторов, XPath выражений, id и т. д. Примеры локаторов:
CSS Selector: `input[type='text']`
XPath: `//*[@id='element_id']`
ID: `element_id`
2. Элементы - это объекты, которые представляют отдельные элементы управления на странице, такие как кнопки, текстовые поля, выпадающие списки и т. д. Для каждого элемента управления создается соответствующий объект Page Object. Примеры элементов:
python
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.username_input = driver.find_element(By.CSS_SELECTOR, 'input[name="username"]')
self.password_input = driver.find_element(By.CSS_SELECTOR, 'input[name="password"]')
self.login_button = driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]')
class HomePage:
def __init__(self, driver):
self.driver = driver
self.logout_button = driver.find_element(By.CSS_SELECTOR, 'a[href="/logout"]')
self.username_label = driver.find_element(By.CSS_SELECTOR, '.username-label')
self.dropdown_list = Select(driver.find_element(By.CSS_SELECTOR, 'select[name="dropdown"]'))
3. Методы - это функции, которые выполняют определенные действия на странице, такие как заполнение полей, клики на кнопки, выбор значений из выпадающих списков и т. д. Методы Page Object могут использовать элементы и локаторы для выполнения этих действий. Примеры методов:
python
class LoginPage:
# ...
def enter_username(self, username):
self.username_input.clear()
self.username_input.send_keys(username)
def enter_password(self, password):
self.password_input.clear()
self.password_input.send_keys(password)
def click_login_button(self):
self.login_button.click()
class HomePage:
# ...
def click_logout_button(self):
self.logout_button.click()
def get_username_label_text(self):
return self.username_label.text
def select_dropdown_option(self, value):
self.dropdown_list.select_by_value(value)
С использованием Page Object позволяет создавать более читаемые и удобные тесты, так как логика каждой страницы инкапсулирована в соответствующем классе Page Object, а методы предоставляют удобный интерфейс для взаимодействия с элементами управления на странице. Кроме того, это позволяет легко поддерживать автоматизированные тесты при внесении изменений в пользовательский интерфейс, так как все изменения можно вносить только в соответствующие классы Page Object без необходимости вносить изменения во всех тестах связанных с этой страницей.
Пример использования Page Object в автоматизированном тесте:
python
from selenium import webdriver
from pages import LoginPage, HomePage
# Инициализация драйвера и открытие страницы
driver = webdriver.Chrome()
driver.get("https://www.example.com/login")
# Создание экземпляра Page Object для страницы входа
login_page = LoginPage(driver)
# Заполнение полей ввода и нажатие кнопки входа
login_page.enter_username("user123")
login_page.enter_password("password")
login_page.click_login_button()
# Создание экземпляра Page Object для домашней страницы
home_page = HomePage(driver)
# Проверка, что пользователь авторизован
assert home_page.get_username_label_text() == "Welcome, user123"
# Выполнение других действий на домашней странице
home_page.click_logout_button()
# Закрытие браузера
driver.quit()
Таким образом, использование Page Object позволяет упростить и структурировать автоматизированные тесты, делая их более надежными и легкими в поддержке и расширении.