Selenium初步使用Profile和Robot

勿忘初心2018-09-27 15:31

本文来自网易云社区

作者:陶奎


视频云性能测试使用Selenium的一点心得。

需求
遇到一个性能测试需求,真实的场景是主播用户通过手机App进行直播,观众用户通过手机App进行观看;采用的是WebRTC技术。目前还没有找到更好的测试方法。
开发部门帮忙开发了一个WebDemo,基于浏览器进行推流操作。这样,我们的测试手段与常规的性能测试手段就有了差别,重点是 离不开浏览器、摄像头、麦克风
于是我们的测试场景变成了这样:使用一批机器,每台机器上模拟多个用户进行推流直播操作。
首先准备测试环境:
    1、测试机器:申请一批Windows虚拟机;我申请的是Win7
    2、摄像头:安装虚拟摄像头;我使用的是VCam_v4.5
    3、麦克风:安装虚拟声卡;我使用的是:Virtual Audio Cable
    4、浏览器:安装最新的FireFox和Chrome
    5、JDK:每台机器安装JDK1.7以上的版本
使用虚拟摄像头、浏览器遇到的各种版本、兼容性问题不一一表述了。
至此我们的测试方法变成了:远程登录到每台虚拟机上,每台机器打开5个窗口,输入调度中心IP地址、端口,推流地址,点击开始推流。
这样,每台机器花费3分钟,30台机器,推送150路流,一轮测试下来光是点点点就花了1个半小时。更别提人工容易眼花、出错。
手累,眼睛累,心累!
自动化刻不容缓!!!

Selenium初步使用(Profile和Robot)
探索自动化之旅,和同事聊了,以前的同学也咨询了下。最终决定选用Selenium的WebDriver来实现。实现了基本的控件定位、操作不详述。
使用Selenium的过程中主要还有遇到了以下几个问题,还好,经历一番波折之后都一一解决。
遇到的问题如下:

1、如何允许摄像头和麦克风
 
由于这个弹框不是页面控件类型的,通过WebDriver无法操作到这个弹框。苦思冥想,最后崇海的提醒下灵机一动,解决。
解决的方式是使用Windows键盘组合操作结合使用。使用Java的java.awt.Robot类。代码如下:
Robot robot = null;
try {
robot = new Robot();
robot.keyPress(java.awt.event.KeyEvent.VK_ALT);
robot.keyPress(java.awt.event.KeyEvent.VK_S);
robot.keyRelease(java.awt.event.KeyEvent.VK_S);
robot.keyPress(java.awt.event.KeyEvent.VK_S);
robot.keyRelease(java.awt.event.KeyEvent.VK_S);
robot.keyRelease(java.awt.event.KeyEvent.VK_ALT);
robot.keyPress(java.awt.event.KeyEvent.VK_ENTER);
robot.keyRelease(java.awt.event.KeyEvent.VK_ENTER);
} catch (AWTException e) {
e.printStackTrace();
}
这段代码实现了键盘操作:Alt+s(释放),Alt+s(释放),Enter(释放)。成功操作:


2、FireFox如何加载用户默认的Profile(基于测试场景需要对about:config进行参数设置)

Profile:对 Firefox 做的所有更改,比如您的主页、工具栏、扩展、保存的密码以及书签等,都被保存在一个特别的文件夹中,称为用户配置文件夹。摘自(https://support.mozilla.org/zh-CN/kb/%E7%94%A8%E6%88%B7%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6
我们的Firefox都有自己的Profile配置,默认情况下,使用WebDriver新打开一个浏览器时,都会在用户的临时目录(%userprofile%\Local Settings\Temp\ )下新建一个profile,而不会读取到原本在about:config中配置好的这些参数。
针对Profile的操作,在网上搜了一大堆,也在官网找了一圈,参照官网的方式进行修改也没有解决。
官网的解决方法(参照:http://www.seleniumhq.org/docs/03_webdriver.jsp):
FirefoxProfile profile = new FirefoxProfile();profile.addAdditionalPreference("general.useragent.override", "some UA string");WebDriver driver = new FirefoxDriver(profile);
File profileDir = new File("path/to/top/level/of/profile");FirefoxProfile profile = new FirefoxProfile(profileDir);profile.addAdditionalPreferences(extraPrefs);WebDriver driver = new FirefoxDriver(profile);
试用了都是没能解决,网上大多数也是这种方式。
最后崇海提醒我使用RemoteWebDriver试试;试了一下,果然是可以;方式是:
  DesiredCapabilities capabilities = new DesiredCapabilities();capabilities.setBrowserName("safari");CommandExecutor executor = new SeleneseCommandExecutor(new URL("http://localhost:4444/"), new URL("http://www.google.com/"), capabilities);WebDriver driver = new RemoteWebDriver(executor, capabilities);
但是Remote的方式会有其他的弊端(主要是通过RemoteWebDriver调用Robot执行Ctrl+T组合键时在远程虚拟机上操作不了)。
     
回过头来还是使用WebDriver,也用DesiredCapabilities试试。该问题解决了
实现代码:
ProfilesIni pi = new ProfilesIni();
FirefoxProfile fp = pi.getProfile("default"); //使用用户默认的配置
DesiredCapabilities dc = DesiredCapabilities.firefox();
// fp.setPreference("media.navigator.video.preferred_codec", "126");
dc.setCapability(FirefoxDriver.PROFILE, fp);
WebDriver driver = new FirefoxDriver(dc);
检验方法:浏览器调用起来之后about:config检查

3、如何实现打开多个标签页。
遇到的问题很多,按照网上的方式在本机调试成功了,但是到远程机上又调动不了等。
这里只介绍我的实现方式吧。
思路是结合Windows组合键操作。一般我们都是用Ctrl+T打开新标签。但不知道怎么回事,远程机上Ctrl+T执行不了,估计是哪边冲突了,没有再细究。找了半天,发现Ctrl+U(打开源码)也可以实现新建一个标签的功能
实现代码:
Robot robot = null;
try {
robot = new Robot();
robot.keyPress(java.awt.event.KeyEvent.VK_CONTROL);
robot.keyPress(java.awt.event.KeyEvent.VK_U);
robot.keyRelease(java.awt.event.KeyEvent.VK_U);
robot.keyRelease(java.awt.event.KeyEvent.VK_CONTROL);
} catch (AWTException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000); //需要添加SleepTime等待页面打开来
} catch (InterruptedException e) {
e.printStackTrace();
}
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(i)); //Driver切换到新的标签页
driver.get(webDemoInst.getJoinUrl());//新标签页打开URL


小结
至此,Selenium基本能支持我的自动化测试了。至于1台主控30台的方式,两种思路:
    1、 一个是采用Selenium自带的Remote WebDriver来实现。
    2、每台机器起一个SocketServer用来接收我发送的参数、命令,调用WebDriver执行
考虑还有别的操作,以及各种参数分配;最终我采用的是第二种方式,现在可以做到1台主控机控制30台测试机,在3分钟内发起压测;并且通过在主控机进行配置,控制发起不同场景、不同数量、以及不同地址等。
现在可以轻松的发起150路压力了。并且以后别的需要浏览器实现的场景,也可以通过这种方式,稍微改下脚本就可以实现了。

网易云免费体验馆,0成本体验20+款云产品! 

更多网易研发、产品、运营经验分享请访问网易云社区