t.me/atinfo_chat Telegram группа по автоматизации тестирования

Как достучаться к объекту driver'a из родительского класса

pytest
appium
selenium
python
Теги: #<Tag:0x00007f21d4e76f10> #<Tag:0x00007f21d4e76dd0> #<Tag:0x00007f21d4e76c90> #<Tag:0x00007f21d4e76b50>

(at_sergei) #1

Добрый день,
Создаю тестовый фреймворк на основе appium и pytest.

Фреймворк разбил на части:

  • PO
  • Локаторы
  • Тесты
  • Хелперы

conftest.py

@pytest.fixture(scope='function', autouse=True)
def driver(request):
    def init_driver():
        logging.info("Creating a webdriver instance")
        return webdriver.Remote(ConfigVars.appium_host, ConfigVars.desired_caps)

    driver = init_driver()
    logging.info(driver.session_id)
    driver.implicitly_wait(5000)
    login(config.user_name, config.pass)

    def fin():
        logging.info("Closing webdriver instance")
        driver.quit()

    yield driver
    request.addfinalizer(fin)

def login(name, password):
    pass

base_page.py


class BaseMobilePage:
    def check_page_title(self, id):
        return self.driver.find_element_by_accessibility_id(id).text

account_page.py

from pages.base_mobile_page import BaseMobilePage

class AccountPage(BaseMobilePage):
    _MESSAGE = f"Welcome {user_name}"

test_1.py

from pages.mobile_pages.account_page import AccountPage

class TestAccountPage(AccountPage):
    def test_1(self, driver):
        txt = self.check_page_title("welcom_msg")
        assert txt == self._MESSAGE

Порядок действий видится следующим:

  1. инициализация драйвера
  2. логин в приложение
  3. тест
  4. закрытие драйвера

И так для всех N тестов

Проблема в том, что при таком подходе переменную driver надо явно передавать, а есть ли какая-нибудь возможность прокинуть инстанс драйвера в родительский класс, скажем в
BaseMobilePage в self.driver?
Возможно предложите какие-нибудь улучшения по архитектуре\логике?

Спасибо!


(Александр Литовский) #2

Нет, подход не верный, driver передавать не надо каждый раз. Посмотрите поиском, тут эти вопросы обсуждались


(at_sergei) #3

Добрый день,

Спасибо за ответ, решил проблему так:

@pytest.fixture(scope='function', autouse=True)
def driver(request):
    def init_driver():
        logging.info("Creating a webdriver instance")
        return webdriver.Remote(ConfigVars.appium_host, ConfigVars.desired_caps)

    driver = init_driver()
    driver.implicitly_wait(10)

    for item in request.session.items:
        cls = item.getparent(pytest.Class)
        setattr(cls.obj, "driver", driver)

    login_(driver, config.user_name, config.pass)

    def fin():
        logging.info("Closing webdriver instance")
        driver.quit()

    yield driver
    request.addfinalizer(fin)

Может не самое элегантное решение, но оно работает

Если есть конструктивная критика, буду только рад