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:
Docker内で走らせたときにこのエラーが出るという報告が多数出ていた。pyppeteerが勝手にダウンロードするchromiumでは動かず、自分で予めダウンロードしたchromiumでないと動かない。executablePathでchromiumのpathを渡すことで直る*1。Chromiumのバージョンは、87.0.4280.141で確認。
websockets.exceptions.ConnectionClosed WebSocket connection is closed: code = 1006 (connection closed abnormally [internal]), no reason
このエラーは単純なページの表示では起きないらしいが、少し複雑なページのテストを行うと出るらしい。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)
pyee==6.0でdocker/macの両環境で動くようになった。