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

说明

由于之前一直使用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

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

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/

你可能感兴趣的:(工作记载)