Chrome と同じ感じで接続

リモートデバッギングを有効にして起動

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 の実装予定はないみたい
サポートされれば検討するとか
現状では積極的に変えていくつもりはなく様子見みたい