如何在Playwright测试中向假麦克风发送音频并控制播放时机
解决方案:在Playwright测试中按需触发模拟音频捕获
方法1:通过Chrome DevTools Protocol(CDP)动态控制音频播放
无需在启动Chromium时指定自动播放音频的参数,而是在测试需要播放音频的时机,通过CDP命令动态注入音频文件并启动捕获,实现按需触发。
示例代码:
test("mytest", async ({ browser }) => { // 启动浏览器,不添加自动播放音频的启动参数 const context = await browser.newContext(); const page = await context.newPage(); // 打开应用并导航到语音识别页面 await page.goto("你的语音识别页面URL"); // 授予麦克风权限,确保应用能访问音频源 await context.grantPermissions(["microphone"]); // 按需启动目标音频的模拟捕获 await context.send("Media.setAudioFakeInput", { file: "/path/to/your/myfile.wav", // 替换为你的音频文件实际路径 repeat: false, // 是否重复播放,按需设置 }); // 根据音频长度和应用识别速度,设置合理等待时间(建议用元素出现等精准条件替代固定超时) await page.waitForTimeout(5000); // 验证语音识别结果 const recognizedText = await page.locator("#识别结果元素选择器").innerText(); expect(recognizedText).toContain("音频中的目标文本"); // 停止模拟音频输入(可选操作) await context.send("Media.clearAudioFakeInput"); await context.close(); });
方法2:动态切换音频文件(适配已用启动参数的场景)
如果必须使用-use-file-for-fake-audio-capture启动参数,可以通过替换指定音频文件的内容,配合重启捕获实现按需播放:
- 启动时指定一个空白静音音频文件作为默认捕获源
- 需要播放目标音频时,将目标音频覆盖到指定的空白文件路径
- 通过CDP命令重启媒体捕获,触发新音频的播放
示例代码(Node.js环境):
import * as fs from "fs"; test("mytest", async ({ browser }) => { const placeholderAudioPath = "/path/to/silent-placeholder.wav"; const targetAudioPath = "/path/to/myfile.wav"; const originalPlaceholderPath = "/path/to/original-silent.wav"; // 备份空白音频文件 // 启动浏览器,指定空白音频作为初始fake捕获源 const context = await browser.newContext({ args: [`--use-file-for-fake-audio-capture=${placeholderAudioPath}`], }); const page = await context.newPage(); // 打开应用并导航到语音识别页面 await page.goto("你的语音识别页面URL"); // 替换空白音频为目标音频,重启捕获触发播放 fs.copyFileSync(targetAudioPath, placeholderAudioPath); await context.send("Media.restartMediaCapture"); // 等待识别完成 await page.waitForTimeout(5000); // 验证识别结果 const recognizedText = await page.locator("#识别结果元素选择器").innerText(); expect(recognizedText).toContain("音频中的目标文本"); // 恢复空白音频文件(可选操作) fs.copyFileSync(originalPlaceholderPath, placeholderAudioPath); await context.close(); });
注意事项:
- 确保音频文件为Chromium支持的格式(如WAV、PCM)
- 优先使用精准的等待条件(如等待识别结果元素加载完成)替代固定超时
- 使用CDP命令前需确保浏览器上下文已获取麦克风权限
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

