Selenoid Docker环境下Chrome远程WebDriver音频播放异常问题
问题描述
作为自动化测试开发人员,我在使用Selenoid Docker配合远程WebDriver运行Chrome时遇到音频播放异常问题。测试场景为:通过Selenium打开Zoom会议,等待产品内置Bot加入会议,Bot通过虚拟音频文件输出音频,最终保存Zoom会议。
预期行为
- 使用Selenium打开Zoom会议
- 等待Bot加入会议
- Bot加入后,Zoom会议UI的音频图标变绿(表示虚拟音频正常输出)
- Zoom会议成功保存至系统
实际行为
- 本地Mac M1使用本地WebDriver运行时,所有流程正常,音频图标变绿
- 本地Mac M1使用Selenoid远程WebDriver运行时,Zoom会议UI的音频图标未变绿,音频功能异常
环境配置信息
- 自动化代码基于Python + Selenium实现,Selenoid服务器部署在AWS EC2 Linux实例,运行多个Docker容器
- Selenoid服务器监听4444和8080端口
- EC2实例已安装ALSA和PulseAudio,Selenoid容器设置
PULSE_SERVER环境变量为"172.17.0.1" - 已修改EC2实例的
/etc/pulse/default.pa文件启用原生TCP协议 - 音频文件
a1.wav存在于EC2实例并挂载到Selenoid容器中,在EC2实例和容器内执行play /home/ubuntu/a1.wav命令均能正常播放(无扬声器) - Selenium选项中已正确配置虚拟音频捕获的文件路径
代码示例
连接远程驱动
webdriver.Remote( desired_capabilities=capabilities, command_executor="http://<EC2实例IP>:4444/wd/hub", options=chrome_options, )
Chrome选项
chrome_options = Options() chrome_options.add_argument("--window-size=1920,1080") chrome_options.add_argument("--use-fake-ui-for-media-stream") chrome_options.add_argument("--use-fake-device-for-media-stream") chrome_options.add_argument("--use-file-for-fake-audio-capture=/home/ubuntu/a1.wav") chrome_options.add_argument("--reduce-security-for-testing") chrome_options.add_argument("--allow-file-access-from-files")
配置项
{ "browserName": "chrome", "browserVersion": "114.0", "selenoid:options": {"enableVNC": True, "enableVideo": True, "enableAudio": True}, }
实验性选项
"profile.default_content_setting_values.media_stream_mic": 2, "profile.default_content_setting_values.media_stream_camera": 2, "profile.default_content_setting_values.geolocation": 2, "profile.default_content_settings.popups": 2, "plugins.plugins_disabled": ["Chrome PDF Viewer", "Adobe Flash Player"], "credentials_enable_service": False, "profile.password_manager_enabled": False, "download.prompt_for_download": False, "enableNetwork": True, "download.default_directory": str(TEMP_FOLDER_PATH),
Selenoid docker-compose.yml配置
version: '3' services: selenoid: image: "aerokube/selenoid:latest-release" privileged: true command: -listen :4444 -conf /home/ubuntu/browsers.json -video-output-dir /home/ubuntu/video -timeout 3m -limit 1 network_mode: bridge ports: - "4444:4444" volumes: - "$PWD:/home/ubuntu/" # 假设当前目录包含browsers.json - "/var/run/docker.sock:/var/run/docker.sock" environment: - PULSE_SERVER=172.17.0.1 # - PULSE_SERVER=unix:/tmp/pulseaudio.socket - PULSE_COOKIE=/tmp/pulseaudio.cookie selenoid-ui: image: "aerokube/selenoid-ui" network_mode: bridge links: - selenoid ports: - "8080:8080" command: [ "--selenoid-uri", "http://selenoid:4444" ] environment: - PULSE_SERVER=172.17.0.1 volumes: - "$PWD:/home/ubuntu/" # 假设当前目录包含browsers.json video-recorder: image: "selenoid/video-recorder:latest-release" network_mode: bridge links: - selenoid chrome-vnc: image: "selenoid/vnc:chrome_114.0" network_mode: bridge links: - selenoid environment: - PULSE_SERVER=172.17.0.1 volumes: - "$PWD:/home/ubuntu/" # 假设当前目录包含browsers.json
browsers.json文件
{ "chrome": { "default": "114.0", "versions": { "114.0": { "image": "selenoid/vnc:chrome_114.0", "port": "4444", "tmpfs": {"/tmp":"size=1024m"} } } } }
疑问
既然在Selenoid容器内执行play/aplay(sox)命令能正常播放音频文件,且虚拟音频路径配置正确,为何通过浏览器(Zoom会议)无法触发音频播放,导致音频图标未变绿?
排查方向与解决方案
1. 确保音频文件在Chrome容器内可访问
当前docker-compose.yml仅给selenoid服务挂载了EC2目录,但Selenoid启动Chrome容器时不会自动继承该挂载配置。需修改browsers.json,在Chrome版本配置中添加volumes字段,将EC2上的音频文件路径映射到Chrome容器内的对应路径:
{ "chrome": { "default": "114.0", "versions": { "114.0": { "image": "selenoid/vnc:chrome_114.0", "port": "4444", "tmpfs": {"/tmp":"size=1024m"}, "volumes": ["/home/ubuntu/a1.wav:/home/ubuntu/a1.wav"] } } } }
修改后重启Selenoid服务,确保Chrome容器能读取到音频文件。
2. 调整Chrome媒体权限设置
实验性选项中media_stream_mic设为2(禁止),但Zoom需要访问麦克风(虚拟设备)才能加载虚拟音频。将该值改为1(允许):
"profile.default_content_setting_values.media_stream_mic": 1,
同时确保--use-fake-ui-for-media-stream参数生效,该参数会自动跳过媒体权限确认弹窗,避免手动授权问题。
3. 验证Chrome容器内PulseAudio连接有效性
进入运行中的Chrome容器,执行以下命令检查音频设备:
# 进入容器(替换<container-id>为实际Chrome容器ID) docker exec -it <container-id> bash # 检查PulseAudio连接 pactl list sinks # 测试音频播放 play /home/ubuntu/a1.wav
如果无法连接PulseAudio,需检查EC2实例的PulseAudio配置:
- 确认
/etc/pulse/default.pa中已启用TCP监听:load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;172.17.0.0/16 - 重启PulseAudio服务:
systemctl restart pulseaudio - 测试时可关闭PulseAuth身份验证:在
/etc/pulse/default.pa中添加load-module module-native-protocol-tcp auth-anonymous=1
4. 检查Chrome虚拟音频加载状态
通过VNC连接到运行中的Chrome容器,打开chrome://media-internals页面:
- 确认
Fake Audio Capture设备已被识别 - 检查是否有错误日志提示音频文件无法加载或权限问题
5. 验证音频文件格式兼容性
Zoom对输入音频有格式要求,确保a1.wav为16位、44.1kHz的PCM格式。可使用以下命令转换格式:
sox /home/ubuntu/a1.wav -b 16 -r 44100 /home/ubuntu/a1_compatible.wav
之后修改Chrome启动参数中的音频文件路径为转换后的文件。
内容的提问来源于stack exchange,提问作者ohadshay

