Aysnc конвертирует объект в сопрограмму.Загрузить поля объекта - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть следующая функция

async def get_page(self, browser):
    page = await browser.newPage()
    await page._client.send("Emulation.clearDeviceMetricsOverride")
    await page.setViewport(
        {"width": 2560, "height": 1600, "deviceScaleFactor": 4})
    return page

Наряду со следующим тестом

def test_get_page(page_test_args):
    client = VjsClient()
    browser = client.get_browser()
    page = client.get_page(browser)
    assert page._viewport == page_test_args

Когда мой код достигает

assert page._viewport == page_test_args

Я сталкиваюсь с этой ошибкой

    def test_get_page(page_test_args):
        client = VjsClient()
        browser = client.get_browser()
        page = client.get_page(browser)
>       assert page._viewport == page_test_args
E       AttributeError: 'coroutine' object has no attribute '_viewport'

Как мне решить эту проблему, чтобы я мог продолжать получать доступ к полям своих страниц и сохранять асинхронную функцию?

1 Ответ

0 голосов
/ 05 февраля 2019
async def get_page(self, browser):

async def здесь означает, что вызов get_page вернет asyncio сопрограмму .Чтобы действительно выполнить get_page и получить результат, вы должны ждать для этой сопрограммы.

Ваш тест должен быть изменен следующим образом:

page = await client.get_page(browser)

Обратите внимание, что если выожидая чего-то внутри функции, эта функция (test_get_page) должна быть сама сопрограммой (должна быть определена с помощью async def) и должна ожидаться где-нибудь для выполнения.

Это означает, что вы должны использовать pytest-asyncio в дополнение к обычному pytest, как показано здесь .

...