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

Как обернуть тесты в глобальные фикстуы (appium+pytest)

pytest
appium
webdriver
python
Теги: #<Tag:0x00007f21d3a658a0> #<Tag:0x00007f21d3a65738> #<Tag:0x00007f21d3a655f8> #<Tag:0x00007f21d3a654b8>

(at_sergei) #1

Здравствуйте,
Пытаюсь автоматизировать мобильное приложение.
Стек: appium+pytest

Инициализирую вебдрайвер 1 раз на сессию:
conftest.py:

@pytest.fixture(scope="session")
def init_driver(request):
    logging.info("Creating a webdriver instance")
    driver = webdriver.Remote(appium_host, desired_caps)
    session = request.node
    for item in session.items:
        cls = item.getparent(pytest.Class)
        setattr(cls.obj, "driver", driver)
    logging.info("Webdriver instance was created")

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

test_accoun_page.py

class TestAccountPageFlow(BaseCase, MobileAccountPage):

    def test_account_settings(self):
        print("11111111")

common.py

@pytest.mark.usefixtures("init_driver")
class BaseCase:
    pass

Есть тесты которые используют приложение, но пользователь должен быть уже залогинен, своего рода прекондишен перед тестами.

Но, я не понимаю как сделать следующию последоватьльность:
инит драйвера
логин
тесты N
логаут
закрытие драйвера

Своего рода декораторы, но тесты могут быть в разных модулях/классах или вызываться по mark.

Просмтрел кучу материала от @polusok, но так и не нашел ответа.
Коллеги прошу Вашей помощи.


(Sergei) #2
@pytest.fixture(scope='session')
def driver():
    init_driver()
    yield
    quit_driver()

@pytest.fixture(scope='session')
def login(driver)
    log_in()
    yield
    log_out()

@pytest.fixture(scope='session', autouse=True)
def setup_env(login):
    pass

(at_sergei) #3

Спасибо за помощь,
Сделал так:

conftest.py

def init_driver():
    logging.info("Creating a webdriver instance")
    return webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)

@pytest.fixture(scope='session', autouse=True)
def driver(request):
    driver = init_driver()
    login_(driver)
    session = request.node
    for item in session.items:
        cls = item.getparent(pytest.Class)
        setattr(cls.obj, "driver", driver)

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

    yield
    request.addfinalizer(fin)

common.py

def _login(driver):
    logging.info("Login")

def _logout(driver):
    logging.info("Logout")

page_obj.py

@mark.usefixtures('driver')
class BasePage():
    pass

test1.py

class TestLogin(MobileHomePage):
    @pytest.mark.webtest
    def test_lesson_1(self):
        logging.info("test 1")

mobile_home_page.py

class MobileHomePage(BasePage):
    pass

Но, тесты иногда падают с ошибкой:

selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Could not proxy command to remote server. Original error: Error: socket hang up

Может кто-нибудь знает в чем причина и как побороть?


(Vladislav Abramov) #4

порты заняты походу

тут есть тема на форуме, где писали как увеличить пул портов, чтоб подобных ошибок не было