@bitande
PHP

Как грамотно сделать page object + pytest, чтобы не передавать фикстуру в каждый page класс?

Хочу создать основу для сайта, который будет тестироваться. Использую Page objext pattern.
Есть основная фикстура, в которой создается класс для работы с webdriver.

Я хочу создать базовый класс Page от которого наследовать остальные страницы. В каждом page объекте должна быть возможность работать с webdriver'om, для этого в конструктор нужно передавать фикстуру-браузер. Соответственно при создании наследников им также нужно передавать эту фикстуру в конструктор.

Это нормально или нет? Меня немного напрягает то, что фикстуру надо в каждую тестовую функцию передавать, а затем и в классы страниц при создании объекта.

Файл conftest, главная фикстура

import pytest
from app.browser import App


@pytest.fixture(scope="session")
def app(request):
    # TODO add authorization check
    app = App()
    request.addfinalizer(app.destroy)
    return app


Класс фикстуры
from selenium import webdriver
from config import *


class App:

    def __init__(self):
        if browser == "firefox":
            self.wd = webdriver.Firefox()
        elif browser == "chrome":
            self.wd = webdriver.Chrome()
        elif browser == "ie":
            self.wd = webdriver.Ie()
        self.wd.implicitly_wait(5)

    def destroy(self):
        self.wd.quit()


базовый класс Page. app - это фикстура - браузер

class Page():

    def __init__(self, app):
        self.wd = app.wd


пример теста:

from pages.index import Index

def test_open_page(app):
    app.wd.get('https://www.restaurantsupply.com')
    index = Index(app)
    assert 'Restaurant Supplies' in index.wd.title
  • Вопрос задан
  • 1947 просмотров
Пригласить эксперта
Ответы на вопрос 1
lxsmkv
@lxsmkv
Test automation engineer
у нас тоже так, только обьект называется не app , а root. Правда мы тестируем embedded системы через GUI.
if root is None:
root = testcore.createRoot(); #ядро фреймворка выдает нам этот обьект
и все функции тестового фреймворка требуют этого объекта. У меня каждый page-класс имеет self.root ссылку создаваемую в конструкторе и везде где надо при использовании фреймворка я её передаю.
tst.press_and_release_button(self.root, buttonname='Button1') # tst тут ссылка на фреймворк.
Т.е я так понимаю у нас сделали пользовательскую обертку воркуг ядра, а у вас напрямую.
Я этот фреймворк не писал, а писал паренъ который и интерпретатор питона на яве для нашей системы написал, потому что jython сильно много памяти ест. И я верю в то, что если оно так, то так надо :) А я только пользуюсь всем этим добром, но вполне себе подход нормальный.
На этот объект можно еще переменных навесить и передавать данные из одного места в другое.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы