Как мне разрешить Chrome использовать мой микрофон программно?

В настоящее время я пытаюсь выполнить некоторые тесты, выполненные с помощью webdriverjs и chromedriver, но им нужны разрешения на микрофон.

Это всплывающее окно, которое отображается:

popup image

Я пробовал:

    chromedriver.start(['--disable-popup-blocking']);
    driver = new Webdriver.Builder()
    .withCapabilities(Webdriver.Capabilities.chrome())
    .build();

но это не сработало.

Я также пробовал

    driver.wait(Until.alertIsPresent(), config.TIMEOUT, 'Alert did not show up');
    driver.switchTo().alert().accept();

это тоже не сработало! Я предполагаю, что это не обычное предупреждение.

Полезные ссылки:

Список аргументов запуска Chrome

Параметры Chrome для java и ruby ​​

Chromedriver github

Как я могу дать им разрешения программно?

Есть ли какой-либо флаг или какой-либо другой способ этого?

Ответ 1

Каждый раз, когда вы запускаете селен, загружается свежий профиль, поэтому изменения, внесенные вами в предпочтения, и разрешения веб-сайта не сохраняются между сеансами. Чтобы исправить это, нам нужно сообщить селену, какой профиль загрузить.

Шаг 1. Найдите свой файл настроек Chrome: www.forensicswiki.org/wiki/Google_Chrome#Configuration

Шаг 2. Скопируйте папку Default где-нибудь. Предположим, что он скопирован на /some/path/allow-mic/Default.

Альтернативный шаг 3 (это проще): Перед копированием Default посетите localhost:1337 с помощью Chrome и установите микрофон, чтобы он всегда позволял.

Шаг 3. Измените allow-mic/Default/Preferences, найдите теги "profile", "content_settings" и "exceptions" внутри друг друга и добавьте

"media_stream_mic":{"http://localhost:1337,*":
                                          {"last_used":1470931206,
                                           "setting":1} },

до "exceptions". Вы должны получить что-то вроде:

...
"profile":{
     ...
     "content_settings": {
         ...
         "exceptions": {
             ...
             "media_stream_mic":{"http://localhost:1337,*":
                                      {"last_used":1470931206,
                                       "setting":1} },
             ...
         },
    },
},
...

Шаг 4: Настройте selenium для использования отредактированных настроек:

var chromedriver = require('chromedriver');
var Webdriver = require('selenium-webdriver');
var chrome = require('selenium-webdriver/chrome');

var opts = new chrome.Options();                   
opts.addArguments("user-data-dir=/some/path/allow-camera");

var driver = new chrome.Driver(opts);

Вы можете проверить, что правильный набор настроек (путь профиля) используется, открыв chrome://version/.

Ответ 2

Немного поздно, но вставьте, как это сделать для других, которые ищут то же самое.

const webdriver = require('selenium-webdriver'), By = webdriver.By, until = webdriver.until,Builder= webdriver.Builder;

var chrome = require('selenium-webdriver/chrome');

var chromeOptions = new chrome.Options()
.addArguments('allow-file-access-from-files')
.addArguments('use-fake-device-for-media-stream')
.addArguments('use-fake-ui-for-media-stream');

var driver = new webdriver.Builder()
.forBrowser('chrome')
.setChromeOptions(chromeOptions);

driver = driver.build();

Ответ 3

Вы можете использовать белый список для аудиозахвата, предоставляя chromedriver с настройкой hardware.audio_capture_allowed_urls.

...
chrome_options = Options()
prefs = {"hardware.audio_capture_allowed_urls" : ["example.org"]}
chrome_options.add_experimental_option("prefs",prefs)
driver = webdriver.Chrome(chrome_options=chrome_options)

Ответ 4

Для тех, кто использует Python, это сработало для меня:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--use-fake-ui-for-media-stream")
driver = webdriver.Chrome(chrome_options=chrome_options)