pyppeteer (+ asyncio) не очень хорошо играет на AWS Severless - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь настроить обработчик Lambda AWS, который включает использование pyppeteer (python-порта безголового Chrome в node.js) для создания снимка экрана.

def getSavePath():
    path = "picture_{}.png".format(random.randint(100, 1000))
    loop = asyncio.get_event_loop()
    loop.run_until_complete(._screenshot(path))
    print("Done taking screenshot...")

    return path

async def _screenshot(path):
    browser = await launch()
    page = await browser.newPage()
    await page.goto(URL, {"waitUntil": "networkidle0"})

    textBox = await page.querySelector('[name="section"]')
    submitButton = await page.querySelector('#submit')
    canvas = await page.querySelector("#canvas")

    await textBox.click({"clickCount": 3});
    await textBox.type(self.wkt)
    await submitButton.click()

    await canvas.screenshot({'path': path})
    await browser.close()

Когда я запускаю это локально, снимок экрана получается, и путь возвращается правильно.

Когда я запускаю это на AWS Lambda, я получаю:

    loop.run_until_complete(._screenshot(path))
  File "/var/task/asyncio/base_events.py", line 296, in run_until_complete
    future = tasks.async(future, loop=self)
  File "/var/task/asyncio/tasks.py", line 516, in async
    raise TypeError('A Future or coroutine is required')
TypeError: A Future or coroutine is required
/var/task/slash.py:50: RuntimeWarning: coroutine '_screenshot' was never awaited

Есть мысли о том, почему это будет работать локально, но не на Lambda?

Я использую Python версии 3.6 как локально, так и на Lambda.

...