10

Obecnie próbuję uruchomić niektóre testy wykonane z webdriverjs i chromedriver, ale potrzebują uprawnień mikrofonu.W jaki sposób mogę zezwolić Chrome na używanie mojego mikrofonu programowo?

Jest to okienko, które pojawia się:

popup image

Próbowałem:

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

ale to nie działa.

Próbowałem też

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

to nie działało! Myślę, że to nie jest zwykły alarm.

Przydatne linki:

Chrome startup arguments list

Chrome options for java and ruby

Chromedriver github

Jak mogę dać im uprawnienia programowo?

Czy jest jakaś flaga lub jakiś inny sposób obejścia tego?

+3

To jest sprawa bezpieczeństwa i najprawdopodobniej Google Chrome nie pozwoli, aby go obejść. Na stronach 'https:' musisz wyrazić zgodę tylko raz. –

+0

pfffff, dzięki za cynk. –

+0

@AlexKudryashev, w rzeczywistości Chrome zablokował dostęp do userMedia, mikrofonu, geolokalizacji i większości interfejsów API w domenie innej niż SSL. 'localhost' jest jednak uważany za bezpieczną domenę (do celów programistycznych). –

Odpowiedz

5

Świeży profil jest ładowany przy każdym uruchomieniu selenu, dlatego zmiany wprowadzone w preferencjach i uprawnienia witryny nie są zachowywane między sesjami. Aby to zmienić, musimy powiedzieć selenowi, który profil załadować.

Krok 1. Znajdź plik preferencji Chrome: www.forensicswiki.org/wiki/Google_Chrome#Configuration

Krok 2. Skopiuj folder Default gdzieś. Zakładam, że jest skopiowany do /some/path/allow-mic/Default.

Alternatywny Etap 3 (jest to łatwiejsze): Przed kopiowaniem Default wizytę localhost:1337 z Chrome i ustawić mikrofon pozwalają na zawsze.

Krok 3. Edycja allow-mic/Default/Preferences, znaleźć tagów "profile", "content_settings" i "exceptions" wewnątrz siebie i dodać

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

do "exceptions". Należy skończyć z czymś takim:

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

Krok 4: Konfiguracja selenium używać edytowane preferencje:

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); 

Można sprawdzić, że poprawny zestaw preferencji (path profil) są w użyciu otwierając chrome://version/.

+0

Wygląda ładnie, spróbuję później. Muszę jednak znaleźć ChromeOptions wewnątrz webdriverjs. –

+0

Nie mogłem użyć tej wskazówki. Ustawiłem ścieżkę do folderu, który miał plik Preferencje, który miał następujące ustawienia: "media_stream_mic": {"http: // localhost: 1337, *": {"last_used": 1473864155.757848, "setting": 1} , "http: // localhost: 1338, *": {"last_used": 1470767319.186194, "setting": 1}, ...} Kiedy prowadzę selen, wciąż prosi o uprawnienia do mikrofonu. –

+0

Czy możesz spróbować dodać "http: //...,*" do swoich adresów URL, aby pasowały do ​​adresów URL w odpowiedzi? Czy próbowałeś użyć alternatywnego kroku 3? Czy sprawdziłeś wersję chrome: //, aby potwierdzić, że używasz właściwego zestawu preferencji? – YellowBird

1

Możesz dodać do białej listy adres URL do przechwytywania audio, dostarczając chromowane urządzenie sprzętowe .preferencja 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) 
5

Trochę późno, ale wklejanie, jak zrobić to tutaj dla innych szukających tego samego.

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(); 
0

Dla tych z użyciem Pythona, to pracował dla mnie:

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)