如何编程让Chrome使用我的麦克风?

19

我目前正在尝试运行由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启动参数列表

Java和Ruby的Chrome选项

Chromedriver Github

如何以编程方式授予它们权限?

是否有任何标志或其他方法可以解决这个问题?


3
这是安全问题,很可能谷歌浏览器不会允许绕过它。在 https: 页面上,你只需要授权一次。 - Alex Kudryashev
谢谢你的提示。 - Tiago Bértolo
事实上,Chrome已禁用在非SSL域上访问userMedia、麦克风、地理位置和大多数API。但是localhost被视为安全域(用于开发目的)。@AlexKudryashev - Adam Azad
检查网站设置(地址栏左侧的锁形图标)[截图](http://image.prntscr.com/image/5f34b364405945baa1bbe4e7ab9874eb.png) - Adam Azad
不要忘记Chrome是作为“全新的”启动的。没有设置、扩展等。 - Tiago Bértolo
显示剩余4条评论
6个回答

14

略微晚了,但为其他寻找同样信息的人粘贴如何做到这一点。

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

4
谢谢 - 只需使用“'use-fake-ui-for-media-stream'”就足以解决我的麦克风权限问题。 - andyandy
太棒了!我也在Java Selenium中工作:options.addArguments("use-fake-device-for-media-stream"); options.addArguments("use-fake-ui-for-media-stream"); driver = new ChromeDriver(options);``` - Cristian Stancalau

7
每次运行selenium时,都会加载一个新的配置文件,因此您对偏好设置和网站权限所做的更改不会在不同的会话之间保留。为了解决这个问题,我们需要告诉selenium加载哪个配置文件。
步骤1. 找到您的Chrome偏好设置文件:www.forensicswiki.org/wiki/Google_Chrome#Configuration 步骤2. 将Default文件夹复制到某个位置。我假设它被复制到了/some/path/allow-mic/Default
替代步骤3(更简单):在复制Default之前,使用Chrome访问localhost:1337并设置麦克风始终允许。
步骤3. 编辑allow-mic/Default/Preferences文件,在其中找到"profile""content_settings""exceptions"标签,并添加以下内容。
"media_stream_mic":{"http://localhost:1337,*":
                                          {"last_used":1470931206,
                                           "setting":1} },

转换为"异常"。最终应该得到类似于以下内容:

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

第四步: 配置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/ 来检查是否使用了正确的偏好设置(配置文件路径)。


1
看起来不错,我晚点会试一下。不过我得在webdriverjs里找到ChromeOptions。 - Tiago Bértolo
我无法使用这个提示。我将路径设置为一个包含以下设置的Preferences文件的文件夹:“media_stream_mic”:{“http://localhost:1337,*”:{“last_used”:1473864155.757848,“setting”:1},“http://localhost:1338,*”:{“last_used”:1470767319.186194,“setting”:1},...}当我运行Selenium时,它仍然要求麦克风权限。 - Tiago Bértolo
你能尝试在URL中添加"http://...,*",以便它们与答案中的URL匹配吗?你是否尝试使用备选的第三步骤?你是否检查过chrome://version以确认你正在使用正确的偏好设置? - YellowBird

5

对于使用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)

3
您可以通过向chromedriver提供hardware.audio_capture_allowed_urls偏好设置来为音频捕获白名单添加url。
...
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)

0
如果你想使用麦克风,
chrome_options = Options()

chrome_options.add_experimental_option('prefs',{'profile.default_content_setting_values.media_stream_mic':1})


driver = webdriver.Chrome(path,chrome_options=chrome_options)

1
为你的代码添加一些描述,这将有助于更好地理解。 - Apoorva Chikara

0

同样地,用于 Splinter

    from splinter import Browser
    from selenium.webdriver.chrome.options import Options 
    chrome_options = Options() 
    chrome_options.add_argument("--use-fake-ui-for-media-stream") 
    Browser('chrome', ** {'executable_path':'chromedriver'},options=chrome_options)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接