自动化测试远程驱动静默方式(Jenkins+Selenium+Chrome+Docker)

于 2017-08-11 18:39:04 发布

由于之前一直使用PhantomJS作为线上静默方案,并且此方案PhantomJS驱动的Binary和测试代码都在同一台服务器上,导致有时候本地做好的Case经常无法完整的正常运作,并且大多数情况下,测试人员本地Case的编写都是采用Chrome作为首选项,所以我们希望能够统一使用Chrome来进行统一驱动,所以本文记载了工作中遇到的一些坑,以免忘记。

注意:此文档所涉及的内容不太适合新同学,新同学可以打开自动化测试入门教程进行学习,大牛可以直接跳过哈。

踏坑过程
所以,在最开始的时候我设想的方案以为是Chrome与PhantomJS一样,只需要简单的下载一个Driver就可以了,后来查阅相关文档才得知Chrome Driver必须要在本机上安装一个Google Chrome浏览器,并且要下载最新的,否则可能不支持Headless,并且支持Headless的ChromeDriver版本也必须要大于等于2.31;然后,我就开始在Centos7上进行折腾安装Google Chrome与ChromeDriver 2.31,2.31版本的Driver总报一个错:./chromedriver: /lib64/libc.so.6: version `GLIBC_2.18’ not found (required by ./chromedriver, 查阅了帖子才知道尼玛2.31在Centos上存在Bug,具体Bug的帖子:链接1-Stackoverflow、链接2-Google Chrome问题、链接3-Chrome Driver问题, 后来打算换2.30搭配Xvfb进行测试,结果还是不行,果断放弃了;后来想竟然Centos7不行,那就到Jenkins Slave的Docker容器中跑的看看吧,因为我这个Slave镜像是用的Debian 8,结果Chrome Driver 2.31是可以运行起来的,我以为一切都OK了,我就上代码开始跑,结果总是不行,我就不信这个邪,继续查阅资料,让我找到了某人做的一个Google Chrome Headless的Docker镜像,我用他的方式运行,并进入到容器中我自己安装Driver 2.31,结果整体测试下来,初步达到我的需求了,尼玛终于弄好了。

实施步骤
方案一(不推荐)
由于我找到的那个镜像并不直接支持ChromeDriver,所以我对他的镜像进行了二次打包,具体可以查看我的Docker Hub地址,或我的Github Dockerfile源码库,都有说明,如果你有任何更好的方案也可以提交PR到我的仓库,我会Merge的,谢谢!

注意:由于此方案是我封装的镜像,非官方的selenium-standalone的方式,会存在一些扩展上的问题,比如没有截图的功能等,在此基础上我推荐使用方案二,当然也可以选择第三方案。

Docker 运行
进入到镜像仓库中,根据文档的说明或直接执行以下在Docker环境运行就可以跑起来了,默认情况下会把ChromeDriver的 –verbose 进行开启。

docker run -d –name selenium-chrome -p 9515:9515 –cap-add=SYS_ADMIN caryyu/selenium-chrome:latest
1
Java代码Selenium使用
URL url = null;
try {
url = new URL(“http://172.16.1.12:9515”);
} catch (MalformedURLException e) {
e.printStackTrace();
}

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments(“–headless”,”–disable-gpu”,”–window-size=1290,1080″);
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability(“chromeOptions”, chromeOptions);
WebDriver wdriver = new RemoteWebDriver(url,capabilities);
方案二(推荐方案)
此方案比第一方案好一些,基于selenium-standalone的方式封装的,通过HTTP地址能够打开并截图监控运行状况,记住Docker运行下列镜像的时候一定要加 –cap-add=SYS_ADMIN 权限(更多查看下面 Docker容器权限 )。

Docker 运行
docker run -it –rm –name chrome –shm-size=1024m –cap-add=SYS_ADMIN -p 4444:4444 yukinying/chrome-headless-browser-selenium
1
Java代码Selenium使用
我只截取了关键的代码片段,主要的核心是以下连接地址。

URL url = null;
try {
url = new URL(“http://172.16.1.12:4444/wd/hub”);
} catch (MalformedURLException e) {
e.printStackTrace();
}
// 初始化WebDriver代码同上

参数说明
–headless 必须使用静默模式,无GUI界面;
–disable-gpu 必须要禁用掉gpu,因为服务器没有图形显示相关支持;
–window-size 自定义窗口大小,因为浏览器的Window大小会决定获取到元素的可能性。
更多配置信息你参考:Google Chrome 命令选项大全
方案三(可选)
此方案是第二方案的升级,同样也是属于standalone的方式,由开源社区进行针对Docker版本的开发与维护,支持很多新特性,如视频录制与回放,VNC直接通过Web实时监控Case的运行情况,更此项目细节请点击这里: 点击查看。

注意:此方案经我测试发现在多线程情况下跑用例对内存与CPU的资源消耗特大,需要仔细研究相关的设置后按优配置方可,切记!切记!

docker run -d –name zalenium -p 4444:4444 \
-e TZ=”Asia/Shanghai” \
-e SCREEN_WIDTH=1920 -e SCREEN_HEIGHT=1080 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v zalenium-videos:/home/seluser/videos \
–privileged dosel/zalenium start

Docker容器权限
上述的例子当中,我们创建运行容器的时候强调了 –cap-add=SYS_ADMIN 选项,并表示此选项必须要加上,否则会出现各种问题;其实还有一个与之对应的选项 –privileged,所以在这里我根据我所查阅到的资料:资料一、资料二,再结合我个人的理解进行简要解释,如下:

–privileged 赋予容器最高权限,基本上宿主机能干的事情,容器里都能干。
–cap-add=SYS_ADMIN 具体指定容器拥有的权限(可多次指定不同权限),更多选项查看这个:点击查看。
Jenkins 推荐两款插件
TestNG & Report
此插件主要针对生成Report对结果进行查看,主要原理就是解析testng.xml文件生成图表视图,具体可以:点击文档。

TestNG In Progress
此插件就是在多线程或单线运行时可以实时监控testcase运行进度状态,可以进行很快定位出错的用例,不用每次针对结果进行查看,具体文档:点击这里。

题外话
题外话与本篇核心无关,你没有兴趣的话直接忽略就行了,我只是把一些杂项记录一下,方便之后的查阅。

Centos 7 安装谷歌浏览器
我们利用yum工具进行安装,因为有一个好处就是更新方便,更多具体细节:点击这里

软件源
我们先创建软件源(/etc/yum.repos.d/google-chrome.repo)。

[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

查看版本信息
yum info google-chrome-stable

安装命令
yum install google-chrome-stable

下载ChromeDriver
wget https://chromedriver.storage.googleapis.com/2.30/chromedriver_linux64.zip

Xvfb虚拟帧缓冲图形X Window服务器
我看有些人利用Xvfb做虚拟图形输出,所以我也把相关的内容记录一下,但我没有尝试成功。Xvfb官网地址, 这里有一个其他人做的Case:点击查看.

安装
yum search xvfb
yum install xorg-x11-server-Xvfb

启动XVFB组件
Xvfb :2 -screen 0 1024x768x16 +extension RANDR &

测试试试
export DISPLAY=:2 && google-chrome http://www.baidu.com

参考资料
https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver
https://sites.google.com/a/chromium.org/chromedriver/
————————————————
版权声明:本文为CSDN博主「littlebrain4solving」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/littlebrain4solving/article/details/77102084