检测声音是不是在硒中播放

Posted

技术标签:

【中文标题】检测声音是不是在硒中播放【英文标题】:Detecting if sound is playing in selenium检测声音是否在硒中播放 【发布时间】:2014-09-25 15:21:43 【问题描述】:

我在 iframe 中为我正在处理的项目加载了一些第 3 方网站,但我需要以某种方式检测这些网站是否正在播放任何声音。我没有看到任何使用 WebDriver 的方法来查看浏览器中是否正在播放声音,还有其他方法可以查询 VM 本身吗?

【问题讨论】:

至少相关:***.com/questions/17349345/… 你能解释一下“播放声音”吗?我的台式机连声卡都没有,能不能按照你的定义“播放声音”? 是的,比如说任何 Flash 应用程序、Java 小程序或任何启动对 OS 核心音频服务的系统调用的东西。即使您没有声卡,核心音频服务仍会收到该请求并尝试处理它,即使它是针对虚拟音频设备的。这就是 VM 的工作方式,然后主机连接到该虚拟音频设备以将其发送到真实音频设备。我想检测我要在 iframe 中加载的任何网页是否会以编程方式让我的用户感到厌烦,所以我不能在那里自动显示它。 您知道 Chrome 在标签中播放声音时如何在标签上放置一个小扬声器图标吗?这就是我想要的。有没有办法使用 selenium 查询 Chrome 的标签名称以检查该图标? Selenium 是一个处理浏览器 DOM 的库。对于其他任何事情,您都需要其他库。 【参考方案1】:

在现代 html5 时代,对于任何检查音频是否正在播放的人,​​我们可以使用 html5 中的 audiovideo 标签来使用 javascript 执行器检查声音播放。下面的代码在 java 和 selenium 中

boolean isPlaying = false;
// find all frames and iterate over it.
// This finds only the top level frames. Frames inside frames are not considered for this answer
for (WebElement iframe: driver.findElements(By.cssSelector('iframe'))) 
    driver.switchTo().frame(iframe);
    // find all the video and audio tags within the frame
    for (WebElement player: driver.findElements(By.cssSelector('audio,video'))) 
       // check if the argument paused is true or false. 
       // In case audio or video is playing, paused is false
       String paused = (String) ((JavascriptExecutor) driver).executeScript('return arguments[0].paused', player);
       if (paused.equals('false')) 
           isPlaying = true;
           break;
       
    
    // switch out from the frame
    driver.switchTo().defaultContent();
    if (isPlaying)
        break;

上面的代码可以修改为跟踪帧内的帧,也可以通过将其更改为递归函数

【讨论】:

以上是关于检测声音是不是在硒中播放的主要内容,如果未能解决你的问题,请参考以下文章

如何检测Windows XP机器上是不是播放任何声音

如何检测 UILocalnotification 声音是不是正在播放

无法在硒中找到预期的元素数量

在硒中按电话键盘输入键

当元素包含多个类名时如何在硒中复制标签?

检查 Windows 上的任何设备是不是正在播放声音 python