使用Selenium Webdriver和Python检测音频

12
也许不太容易,但是我希望能够在Selenium中加载一个网页并测试是否自动播放Flash或HTML5音频。
理论上,当用户访问我的网站时,他们可以看到视频播放但听不到声音(这是正确的方式)。有时,音频将随视频自动播放,这不是我想要的。
我想知道是否有一种方法可以通过Python和Firefox检测是否正在播放任何音频?我的内部测试将加载页面并执行相当多的Selenium检查,以确保一切都正常。我想添加一个测试,通过Python或Selenium检查音频是否正在播放并标记它。
有什么想法吗?

2
我很抱歉,这不是Webdriver可以处理的事情。 - alecxe
我也这么想。可能得依靠Python或其他什么东西。 - Matt Essenburg
除非查询操作系统的音频系统以报告Selenium启动的浏览器是否向其发送任何音频,否则我不知道你该如何做到这一点。 - Louis
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 Scraping

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

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


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