seleniumでカメラやマイクを使った通話系コンテンツのテストをする際に、Docker環境などでブラウザ環境を作って棄ててとやっていると、毎回Chromeプロファイルごと棄てられるため、毎回カメラやマイクの許可を求められたり、また、AWS環境でそれらのテストを実行する場合はそもそもハードウェアがなく、ハードウェアがあるパターンのテストとかどうやるん的な感じになって結構あちこち調べ回ったのでそのメモです

テスト環境

  • selenium 3.141.0
  • selenoid 1.10.0
  • Robotframework 3.2.2
  • Robotframework SeleniumLibrary 4.5.0
  • Google Chrome 88
  • Docker 20.10.2

仮想デバイスを実装するオプションを付与する

まず、上記の記事にある通り、 --user-fake-ui-for-media-stream --user-fake-device-for-media-streamをChrome起動時のオプションに設定します

// ←追加の部分をオプションに追加します

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
*** Settings ***
Documentation ブラウザ設定

*** Variables ***
&{DESIRED_CAPABILITIES} enableVNC=${${ENABLE_VNC}} enableVideo=${${ENABLE_VIDEO}}

*** Keywords ***
ブラウザを開く
[Arguments] ${ADDRESS} ${ALIAS}

${options} = evaluate sys.modules['selenium.webdriver'].ChromeOptions() sys

call method ${options} add_argument --no-sandbox
call method ${options} add_argument --disable-dev-shm-usage
call method ${options} add_argument --ignore-certificate-errors
call method ${options} add_argument --allow-file-access-from-files
call method ${options} add_argument --use-fake-ui-for-media-stream // ←追加
call method ${options} add_argument --use-fake-device-for-media-stream // ←追加
call method ${options} add_argument disable-infobars

Open Browser ${ADDRESS} Chrome alias=${ALIAS} remote_url=${HUB_URL} options=${options} desired_capabilities=${DESIRED_CAPABILITIES}

ブラウザにアクセス権限を付与する

次に、カメラやマイク、ついでに位置情報やデスクトップ通知などを許可するようブラウザに付与します(例えば、「カメラへのアクセスを求めています」みたいなプロンプトが出るやつを防ぐ設定)

// 追加 ここから ---->から // 追加 ここまで <---- の部分をオプションに追加します

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
*** Settings ***
Documentation ブラウザ設定

*** Variables ***
&{DESIRED_CAPABILITIES} enableVNC=${${ENABLE_VNC}} enableVideo=${${ENABLE_VIDEO}}

*** Keywords ***
ブラウザを開く
[Arguments] ${ADDRESS} ${ALIAS}

${options} = evaluate sys.modules['selenium.webdriver'].ChromeOptions() sys

call method ${options} add_argument --no-sandbox
call method ${options} add_argument --disable-dev-shm-usage
call method ${options} add_argument --ignore-certificate-errors
call method ${options} add_argument --allow-file-access-from-files
call method ${options} add_argument --use-fake-ui-for-media-stream
call method ${options} add_argument --use-fake-device-for-media-stream
call method ${options} add_argument disable-infobars

// 追加 ここから ---->
${prefs}= Create Dictionary
... profile.content_settings.exceptions.media_stream_mic=1
... profile.content_settings.exceptions.media_stream_camera=1
... profile.content_settings.exceptions.geolocation=1
... profile.content_settings.exceptions.notifications=1
call method ${options} add_experimental_option prefs ${prefs}
// 追加 ここまで <----

Open Browser ${ADDRESS} Chrome alias=${ALIAS} remote_url=${HUB_URL} options=${options} desired_capabilities=${DESIRED_CAPABILITIES}

ちなみに、 profile.default_content_setting_valuesという指定も見かけましたが今回は使用していません

1
2
3
4
...  profile.default_content_setting_values.media_stream_mic=1
... profile.default_content_setting_values.media_stream_camera=1
... profile.default_content_setting_values.geolocation=1
... profile.default_content_setting_values.notifications=1

その他: Open xdg-open?プロンプトの制御

以前に記事を書いています、こちらもどうぞ