chromium、headlessモードでscreenshotを撮影する時に詰まったのでメモ
結論
chromiumの–timeoutはタイムアウトでは無くDOMContentLoadedが発火してからのdelay
環境
- Chromium 111.0.5563.64 snap
検証
test.htmlに検証用のサイトを作る
このサイトはDOMContentLoaded発火後からの時間を計測しweb上に表示する
<!-- test.html -->
<!-- 略 -->
<script>
document.addEventListener('DOMContentLoaded', () => {
const start = Date.now();
setInterval(() => {
document.getElementById("time").innerHTML = Date.now() - start + "ms";
}, 100);
});
</script>
<body>
<p id="time">loading...</p>
</body>
<!-- 略 -->
検証で使うコマンドはシンプルで –timeout にミリ秒を指定する
chromium-browser --headless --window-size=1440,2000 --timeout=1000 --screenshot http://localhost/test.html
–timeout | 出力 |
---|---|
0 | loading… |
100 | 101ms |
1000 | 1000ms |
2000 | 2001ms |
DOMContentLoadedが発火した100ms後に最初の書換が行われるのでloading…のままなのは正しい
1ms遅延があるのは気にしないで良さそう
検証2
ページアクセス時ではなくDOMContentLoaded後に発火していることを確認するためにDOMContentLoadedの発火を遅くしてみる
重いことで有名なjQueryの非圧縮版をロードしてみる
自分の環境だと200msかかる
<!-- 略 -->
<script src="https://code.jquery.com/jquery-3.6.4.js"
integrity="sha256-a9jBBRygX1Bh5lt8GZjXDzyOB+bWve9EiO7tROUtj/E=" crossorigin="anonymous"></script>
<!-- 略 -->
–timeout | 出力 |
---|---|
0 | loading… |
100 | 100ms |
1000 | 1000ms |
2000 | 2000ms |
構文解析が終わってしばらくした後に実行されているせいか検証1と違いtimeoutと出力に1ms以上の差がなかった
後書き
最初は time コマンドで計測しようとしたが出力に大きなブレがあり正確に測れなかった