使用Selenium Webdriver和Python检测音频

12 投票
1 回答
6951 浏览
提问于 2025-04-18 18:46

这可能不太容易实现,但我想在Selenium中加载一个网页,测试一下是否有Flash或HTML5自动播放音频。

理论上,当用户访问我的网站时,他们可以看到视频播放,但没有声音(这是正确的做法)。有时候,视频会自动播放声音,这正是我不想要的。

我在想有没有办法通过Python和Firefox检测是否有音频在播放?我的内部测试会加载页面,并进行很多Selenium检查,以确保一切正常。我想做的是增加一个测试,检查音频是否在播放,并标记出来。

有什么想法吗?

1 个回答

8

我也遇到过类似的问题。我在网上处理很多音频,需要自动检查音频质量、音频播放等。我在Groovy或Ruby中找不到合适的库(Python我没查),所以我调用了一个已安装的程序(sox),它可以实时检查音频是否被听到。

这是我的Groovy调用/脚本:

 def audioCheck = "sox -t coreaudio Soundflower /Users/me/project/record.wav silence 1 0.1 1% 1 .1 1%".execute()
             audioCheck.waitFor()
            println "EXIT VALUE FOR SOX IS: ${audioCheck.exitValue()}"

            if(audioCheck.exitValue() == 0){
                 // some stuff would happen now, if exit code is 0
            }

关于Core Audio和“Soundflower”

sox命令中用-t coreaudio指定了音频设备(在Linux上,你可能会用alsa而不是'coreaudio',因为coreaudio是OSX的音频接口)。“Soundflower”参数是我在Soundflower中创建的频道。这个对我来说很重要,因为我需要单独录音(因为我在做音频质量检查)。举个例子,如果你使用默认频道,比如alsa defaultcoreaudio default,它会拾取到你的麦克风声音……所以如果旁边的人打喷嚏……就会影响测试结果。

通过使用虚拟音频频道(像OSX上的Soundflower),你可以把所有音频输出设置为“Soundflower”,然后让sox命令在那个频道上运行……这样你就只会听到从虚拟频道输出的系统音频。

你也可以使用默认频道(但一旦听到房间里的其他声音,它就会停止)。

我用Groovy任务异步运行了那段代码……所以这段代码被包裹在类似这样的结构中:

def listener = task { ... my script above ... }

因为它是异步监听的,所以不会阻塞其他测试。

Sox命令

我使用的实际sox实时命令,来自这个人的视频(可以看看,他使用了一些不同的参数):

https://www.youtube.com/watch?v=Q5ntlKE0ze4

扩展功能

我进一步推动了这个功能,能够自动录制通过浏览器播放的音频,然后使用PESQ算法来判断录制的音频与播放的原始音频有多接近。如果你对此感兴趣,可以查看我关于这个的帖子:

http://sdet.us/webrtc-audio-quality-automation-with-pesq/

Python PCAP抓包

这可能和你做的事情无关,但我也尝试过使用Pyshark库从数据包捕获中重建音频……这更复杂,也可能更脆弱。但如果你感兴趣,这里是我的实现:

http://sdet.us/python-pcap-parsing-audio-from-sip-call/

撰写回答