刺身の上にたんぽぽ乗せる日記

プログラミングしたり、自販機の下に落ちてる小銭を集めたりしてます

Pyppeteerをdocker環境とmacで動かす

Google Cloud Buildでbazel testで動かしてたpyppeteerが動くようになるまでのメモ。

  • TL;DR
    • Docker環境ではダウンロード済みのchromiumをexecutablePathで指定
    • pyppeteer==0.0.25
    • websockets==6.0.0
    • pyee==6.0.0


ブラウザからの反応がなくなるタイプの問題はpyppeteerのlogLevelをDEBUGにすると見つけやすい。

import logging
browser = await launch(logLevel=logging.DEBUG, args=["--no-sandbox"])

File "/builder/home/.cache/bazel/_bazel_root/eab0d61a99b6696edb3d2aff87b585e8/execroot/__main__/bazel-out/k8-fastbuild/bin/django/testutil/test_puppeteer.runfiles/pypi__pyppeteer_0_2_5/pyppeteer/launcher.py", line 226, in get_ws_endpoint
raise BrowserError('Browser closed unexpectedly:\n')
pyppeteer.errors.BrowserError: Browser closed unexpectedly:

stackoverflow.com

Docker内で走らせたときにこのエラーが出るという報告が多数出ていた。pyppeteerが勝手にダウンロードするchromiumでは動かず、自分で予めダウンロードしたchromiumでないと動かない。executablePathでchromiumのpathを渡すことで直る*1Chromiumのバージョンは、87.0.4280.141で確認。

websockets.exceptions.ConnectionClosed WebSocket connection is closed: code = 1006 (connection closed abnormally [internal]), no reason

github.com

このエラーは単純なページの表示では起きないらしいが、少し複雑なページのテストを行うと出るらしい。websockets==6.0.0にダウングレード*2すると直る。

TypeError: create_connection() got an unexpected keyword argument 'ping_interval'

pyppeteer0.2.2~0.2.5(最新)はwebsockets==6.0.0にない引数を使うためpyppeteer==0.0.25までダウングレードする必要がある。この段階でdockerでpyppeteerは動くようになったが、macでまだ動かなかった。

RuntimeWarning: coroutine 'Browser._targetInfoChanged' was never awaited f(*args, **kwargs)

github.com

pyee==6.0でdocker/macの両環境で動くようになった。

*1:Macでは問題なかった

*2:最新版は8.0.0