Playwright/PyTest – использование объектов страницы в качестве фиксаторовPython

Программы на Python
Ответить
Anonymous
 Playwright/PyTest – использование объектов страницы в качестве фиксаторов

Сообщение Anonymous »

Я создаю проект автоматизации с использованием Playwright и Python.
Это базовая структура моего проекта:
Изображение

Мне интересно узнать, как лучше всего использовать приспособления pytest для инициализации объектов моей страницы, поэтому мне придется сделать это только один раз, а затем только для вызова фикстур в соответствующих тестах.
Это мой файл test_login.py:

Код: Выделить всё

import pytest
from playwright.async_api import async_playwright
from ...infra.page_objects.login.login_page import LoginPage

@pytest.fixture
async def browser():
async with async_playwright() as playwright:
browser = await playwright.chromium.launch()
yield browser
await browser.close()

@pytest.fixture
async def login_page_fixture(browser):
page = await browser.new_page()
print("page created")
login_page = LoginPage(page)
print("login_page created")
yield login_page
await page.close()

@pytest.mark.asyncio
async def test_login_with_valid_credentials(login_page_fixture):
login_page = await login_page_fixture
print(f"login page url: {login_page.url}")
а это мой файл login_page.py:

Код: Выделить всё

from playwright.async_api import Page, expect

class LoginPage:
def __init__(self, page: Page):
self.page = page
self.url = 'https://opensource-demo.orangehrmlive.com/web/index.php/auth/login'
self.header = page.locator(".orangehrm-login-branding")
self.header_logo = page.get_by_role("img", name="company-branding")
self.username_field = page.get_by_placeholder("Username")
self.password_field = page.get_by_placeholder("Password")
self.login_button = page.get_by_role("button", name="Login")
self.forgot_password_link = page.get_by_text("Forgot your password?")

async def goto(self) :
await self.page.goto(self.url)

async def verify_page_loaded(self) :
await expect(self.header).to_be_visible()
await expect(self.login_title).to_be_visible()

async def login(self, username: str, password: str) :
await self.fill_username(username)
await self.fill_password(password)
await self.click_login_button()

async def fill_username(self, username:str) :
await self.username_field.fill(username)

async def fill_password(self, password: str) :
await self.password_field.fill(password)

async def click_login_button(self) :
await self.login_button.click()

async def click_forgot_password(self) :
await self.forgot_password_link.click()
Когда я запускаю тест с помощью этой команды pytest test_login.py, я получаю следующее сообщение об ошибке:

Код: Выделить всё

> login_page_fixture = 

@pytest.mark.asyncio
async def test_login_with_valid_credentials(login_page_fixture):
>       print(f"login page url: {login_page_fixture.url}")
E       AttributeError: 'coroutine' object has no attribute 'url'

test_login2.py:22: AttributeError
================================================================================= short test summary info =================================================================================
FAILED test_login2.py::test_login_with_valid_credentials - AttributeError: 'coroutine' object has no attribute 'url'
==================================================================================== 1 failed in 0.05s ====================================================================================
sys:1: RuntimeWarning: coroutine 'login_page_fixture' was never awaited
Каково правильное решение и лучшая практика для этого?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»