python - 异步将对象转换为协程。加载对象字段

标签 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'

如何解决此问题,以便我可以继续访问我的页面字段并保留异步功能?

最佳答案

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除了如图所示的普通 pytest here .

关于python - 异步将对象转换为协程。加载对象字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54525375/

相关文章:

python - Asyncio 循环等待事件

python - 安装 Anaconda 后不显示 Jupyter notebook 和 Anaconda Navigator

python - 为什么 aiohttp 需要 await 才能获取 body?

python - 某处是否有不兼容 64 位的 Python 包列表?

python - 异步 : Wait for event from other thread

python - asyncio 的 call_later raises 'generator' object is not callable with coroutine object

python - 使用三重索引填充数据框中的日期

python - 阅读 ID3 标签的最佳库是什么?

python - asyncio 的 loop.run_in_executor 是线程安全的吗?

python - aiohttp 与 asyncio 和信号量返回一个填充 None 的列表