По опыту, если планируется много UI тестов (большой продукт) лучше добавить промежуточный уровень абстракции между тестами и PO, назовем его Actions. Итого:
WebDriver (предоставляется браузером для взаимодействия с сайтом)
Selenium ( юзает WebDriver)
BasePage + PageObject слой - простые действия с элементами сайта, для каждой страницы свой
Actions слой - осмысленные действие пользователя (липа логин, купить товар), которые используют один и более метод слоя PageObject.
- По опыту, для каждого модуля PageObject лучше использовать свой отдельный Actions слой.
- При этом, Actions могут использовать друг друга и чужой PageObject, но PageObject использовать чужой PageObject не должны.
Tests - использует Actions слой
Кстати, BasePage можно для всех PageObject можно сделать один, просто храня ссылку сайта внутри PageObject класса
Выглядеть функция login Actions слоя будет примерно так
def login(login_name, password):
login = SomeLoginPage() - в класс PO может быть встроено открытие страницы прямо в инит с флажком отключения, если не надо
login.enter_login(login_name)
login.enter_password(password)
login.click_login()
Обратите внимание, что в этом случае PO слой содержит атомарные операции, пихать в методе проверки не стоит.
Если тебе придётся сделать какое-то базовое действие вебдрайвера, например, единично ткнуть на какой-то элемент, тоже для этого будешь отдельный action писать, чтобы развязать слои? Или начнёшь их смешивать?