You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 18:00:08