Aysnc将对象转换为协程。加载对象字段

时间:2019-02-04 22:38:38

标签: python python-asyncio

我具有以下功能

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 :(得分:1)

async def get_page(self, browser):

async def在这里意味着对get_page的调用将返回asyncio coroutine。要实际执行get_page并获得结果,您应该await使用此协程。

您的测试应该通过以下方式更改:

page = await client.get_page(browser)

但是请注意,如果您等待函数内部的某些内容,则此函数(test_get_page)必须本身是协程(必须用async def定义),并在某个地方等待执行。

这意味着您应该像显示pytest-asyncio一样使用here和普通pytest