WSL2でPuppeteer(headless:false)を動かすためのメモ書き

[追記]

Windows 11では、inuxのGUIアプリをシームレスに利用できる「WSLg」という機能が追加されます。Puppeteerに内蔵されているchromiumも X環境を構築しなくても起動できるようになります。

以下、元の記事。


WSL2でPuppeteerを使うための環境設定メモです。

■wsl2(Ubunte)にpuppeteerをインストールする

とりあえず、wslにpuppeteerをインストールします。

参考:Installing Puppeteer on an Ubuntu AWS EC2 Instance

・必要なライブラリのインストール

・puppeteerのインストール

npm install puppeteer --save

これでヘッドレスモードでのpuppeteerは動くきますが、headless:false(ヘッドフルモード)で実行するとChromiumが起動できずにエラーがでます。
これだとデバッグがしづらいのでWSL2でヘッドフルモードのChromiumを起動できるようにします。

■wsl2でフルモードのChromiumを実行できるようにする

X環境を構築してWSL2(Ubunte)のGUIアプリケーションを実行できるようにします。

参考:PhpStorm on WSL2でWindowsに依存しない開発環境を作る – レガシー環境から脱却したい

以下は、上記参考サイト「X環境のインストール」の内容ほぼそのままなので、詳細はリンク先でご確認ください。

・ホスト側(Windows)にXサーバソフト(VcXsrv)をインストールする
VcXsrv Windows X Server download | SourceForge.net

VcXsrvを起動して設定する。
1. Multiple windows
2. star a program(端末起動時に実行する)
3. 三か所すべてにチェック
(Disable access control にチェックを入れないとwsl側からの接続に失敗するので注意)
以上でwindows側の設定は終了

・wsl側にクライアントをインストールする

sudo apt update && sudo apt upgrade -y
sudo apt install -y xfce4-terminal xfce4-session xfce4

xサーバ(ホスト)のipアドレスを取得してDISPLAYに設定するコマンドを、WSL2側の”.bashrc”に記述する

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0

これで、headless:falseモードでもpuppeteerを実行できるようになりました。

テスト用サンプルコード

const puppeteer = require('puppeteer');


async function run() {
    const browser = await puppeteer.launch({
        headless: false,
        args: ['--no-sandbox',"--lang=ja"]
    });
    const page = await browser.newPage();
    await page.goto('https://google.com');
    await page.screenshot({
        path: 'example.png'
    });

    //await browser.close();
}

run();

実行結果