リモートデバッギングを有効にして起動
firefox --remote-debugging-port 9222
接続とページ遷移は Chrome と同じ感じでできる
import CDP from "chrome-remote-interface"
const cdp = await CDP()
await cdp.Page.navigate({ url: "https://github.com/" })
ページ内でスクリプトの実行は Chrome だと↓で動く
const expression = `document.title`
await cdp.Runtime.evaluate({ expression, returnByValue: true })
でも Firefox だと context が null と言われてエラー
Chrome のドキュメントだとオプショナルだけど evaluate のパラメーターに contextId を渡せる
ExecutionContextId という型で実体は int
試しに 0 や 1 など渡してみても指定の id の context がみつからないというエラー
context を作る方法を探すと Page.createIsolatedWorld で isolateworld を作ると返り値として ExecutionContextId が受け取れるみたい
Page.createIsolatedWorld には frameId が必要になるけどこれは Page.navigate で受け取れる
試してみたけどフレームが見つからないと言われてエラー
やっぱり Firefox を直接 CDP で動かすのはやめたほうが良さそう
調べてると Selenium は Firefox の CDP サポートをやめる予定があるみたい
https://github.com/SeleniumHQ/selenium/issues/11736
理由として Firefox の CDP 対応が不完全で新しい BiDi の対応を重視してるみたい
https://w3c.github.io/webdriver-bidi/
BiDi が標準化されて普及するなら Playwright もこっちに切り替えていく方針なのかなと思って調べるとこんな QA が出てきた
https://github.com/microsoft/playwright/discussions/14014
動画内での発言で 全メジャーブラウザがサポートされない限り BiDi の実装予定はないみたい
サポートされれば検討するとか
現状では積極的に変えていくつもりはなく様子見みたい