PHPカンファレンス関西2015で発表した「PHPer だからこそ知っておきたい、JavaScript のテストを複数ブラウザで自動実行する話」のときの質問に答えられなかった件へのアンサー日記(?)を「Karma でブラウザのプロファイルを切り替えて使う方法として書いた。
この時は karma-script-launcher を使った方法を紹介してみたのだけど、「まだ良くわかってないところがある」と自分でも書いているとおり、ちょっと何かがしっくりこなかった。
「プロファイルを切り替えて使いたい」というニーズはよくある話で、Selenium を使ってたときにもオレ自信悩んでいたこともある(例えば自組織内のオレオレ SSL 証明書を許可したプロファイルを使いたい、とか)。
そういう一般的な悩みに対しては、もっと良いアプローチが用意されているのでは?と思って、もうちょっと追加で調べていたら、あったよ、本命と思われる解決策が。
また、Firefox を例にして説明する。Karma で Firefox を使う場合は karma-firefox-launcher を利用するのだけど、npm の説明ページ の Custom Preferences のところにヒントが書かれていた。
browsers: ['FirefoxAutoAllowGUM'],
customLaunchers: {
FirefoxAutoAllowGUM: {
base: 'Firefox',
prefs: {
'media.navigator.permission.disabled': true
}
}
}
この例は、次のような内容になる。
これで Karma をスタートすると、デフォルト設定のプロファイル中の「media.navigator.permission.disabled
」という設定を上書きした Firefox が起動する。
そういうやり方があるのか!と思って、karma-firefox-launcher のソースコードを読み始めたら、プロファイルを指定する方法があった。こんな感じでプロファイルの path を指定してやれば良かったのだ!(念のため言っておくと、この path はオレの(かつ加工している)ものなので、自分の path は自分で探して設定してくださいな)
browsers: ['Firefox_karma_pref'],
customLaunchers: {
Firefox_karma_pref: {
base: 'Firefox',
profile: '/Users/suzuki/Library/Application Support/Firefox/Profiles/5a3krc90.karma'
}
}
実際にやってみよう。まずは、違いが分かるように karma プロファイルの検索設定を変えておく。プロファイルを選択して Firefox を起動。
デフォルト検索エンジンを「Yahoo! JAPAN」へ変更する。
これで準備は完了。
では、まず、プロファイルを指定しない、通常の Firefox を指定した Karma を起動する。karma.conf.js
の設定はこのようになる。
browsers: ['Firefox']
これで起動した Firefox の設定画面を見てみると、デフォルト検索エンジンが「Google」になっているのが分かる。
次は karma プロファイルを設定したカスタムブラウザを指定して起動する。karma.conf.js
の設定内容は(繰り返しになるが)こんな感じになる。
browsers: ['Firefox_karma_pref'],
customLaunchers: {
Firefox_karma_pref: {
base: 'Firefox',
profile: '/Users/suzuki/Library/Application Support/Firefox/Profiles/5a3krc90.karma'
}
}
これで Karma を起動し、同様にデフォルト検索エンジンの設定を見ると「Yahoo! JAPAN」になっているのが分かる。うまく「karma という名前のプロファイル」で Firefox が起動してくれたようだ。
この方法であれば、前回の「karma-script-launcher を利用してプロファイルを指定したシェルスクリプトを起動する」方法で発生していた「どうやって URL の動的 id を指定すれば良いのだろう?」という疑問は起きない。
少なくとも Firefox におけるプロファイル指定は、このカスタムランチャー(カスタムブラウザ)を利用する方法が正解だと思う。これは今年の 1 月に取り込まれた機能のようで、まだ README とかには反映されていない様子。
ソースコードを読んで解決策を得られたので、オープンソースで良かった案件だった。