ClojureScriptでPuppeteerを使う。環境はDockerコンテナに入れる。ホストはLinux。以下、参考サイト。
- Puppeteer(https://github.com/GoogleChrome/puppeteer)
- Dockerコンテナ上でGUIプログラムを動かす方法(http://wiki.ros.org/docker/Tutorials/GUI)
- Puppeteerが起動しないとき(https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md)
- Promiseを多用するJSライブラリをClojureScriptから使う(https://github.com/athos/kitchen-async)
$ git clone https://github.com/gpsoft/pupp-cljs.git
$ cd pupp-cljs
$ make image
$ make dev
この先は、コンテナの中。lein、boot、clj、npm、nodeは既に使える状態。
lumoを入れる。
$ npm install -g lumo-cljs
Puppeteerのサンプルプログラムindex.jsを動かす。
$ npm install
$ node index.js
$ ll yahoo.png
ヤフーのトップページのスクリーンショットがyahoo.pngへ保存されてる。
$ lein cljsbuild once
$ node out/main.js
$ ll google.png
$ lumo -D kitchen-async:0.1.0-SNAPSHOT
cljs.user=> (require '[kitchen-async.promise :as p])
nil
cljs.user=> (require 'puppeteer)
nil
cljs.user=> (p/let [opts {:args ["--no-sandbox"
#_=> "--disable-setuid-sandbox"]}
#_=> browser (puppeteer/launch (clj->js opts))
#_=> page (.newPage browser)]
#_=> (.goto page "https://www.google.com")
#_=> (.screenshot page #js {:path "google.png"})
#_=> (.close browser))
#object[Promise [object Promise]]
cljs.user=>
カーネル4.19.2でDockerイメージのビルドに失敗。docker/for-linux#480
host $ echo N |sudo tee /sys/module/overlay/parameters/metacopy
openjdk-8-jdkを入れると、headlessオフのChromeがうまくいかない。無地の矩形が出るが、その先に進まない感じ。GUIが全滅というわけじゃなくて、dclockとかはちゃんと出る。
Puppeteerの1.10.0だと、ダメみたい。
(node:915) UnhandledPromiseRejectionWarning: TypeError: Cannot read property '_launcher' of null
at launch (/home/maru/proj/node_modules/puppeteer/lib/Puppeteer.js:36:17)
at /home/maru/proj/out/compiled/pupp_cljs/main.js:8:89
at process._tickCallback (internal/process/next_tick.js:43:7)
at Function.Module.runMain (internal/modules/cjs/loader.js:778:11)
at startup (internal/bootstrap/node.js:300:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:826:3)
1.0.0ならOK。