背景

公司内部的Selenium Grid服务基本都是我帮忙搭建在Win服务机器上,使用我的或者admin账号运行了hub和node节点,那么当别的团队使用Selenium Grid时,如果想查看脚本现在执行页面情况,经常需要找我远程链接帮忙查看具体页面情况,那个烦!!再加上公司安全性管控较严个人账号也是绝对不允许同事间分享,全公司的Chrome都是IT推送升级,这样我就得经常去更新node节点上ChromeDriver的版本,那个烦烦!

更坑的是,我们所用的电脑都是木有admin权限,而且Chrome很多功能都加入了admin管理,例如安装本地插件等都需要admin权限才能安装。 而且大家都知道,ChromDriver在2.28(如果我没记错的话)版本后,启动Chrome都会本地加载一个Automation extensions,那么这时如果你执行脚本启动浏览器一定会报一个权限错误,尽管我们申请了win服务机器的admin权限,也申请了IT把这些机器排除在管控范围外,然而。。。呵呵哒,总之烦烦烦!
所以我就默默决定找个时间,找个替代方案,一来解决脚本执行时,可以非常便捷而且不限制用户的查看服务器浏览器情况,二来避免IT管控引起的各种问题。

方案确定

经过几天折腾和比较,最后决定搭建两套开源方案,供不同项目组不同需求使用。
方案1:Selenoid
方案2:Zalenium

下面简单演示两套方案的搭建和基本使用,并最后列出和Selenium Grid的比较


Selenoid

Selenoid 简介

Selenoid是一个使用Go语言来实现的Selenium Gird。它通过Docker来启动浏览器。
GitHub: https://github.com/aerokube/selenoid
官方帮助文档: http://aerokube.com/selenoid/latest/#_getting_started

Selenoid 的搭建

Docker 安装

简介中知道是通过Docker来启动浏览器的,所以如果机器上没有docker,需要先安装docker,安装步骤和简单使用详细见:
https://www.jianshu.com/p/4bc3f8ece55d
https://docs.docker.com/engine/installation/

Selenoid 搭建过程我们需要用到Selenoid 和Selenoid UI,所以我们需要下载这两个的images。

说明:
Selenoid UI 是Selenoid 的一个简单页面,通过页面可以查看到时时状态。
GitHub: https://github.com/aerokube/selenoid-ui
官方帮助文档:[http://aerokube.com/selenoid-ui/latest/
](http://aerokube.com/selenoid-ui/latest/***)

docker pull 相关镜像:

  1. $ docker pull aerokube/selenoid-ui
  2. $ docker pull aerokube/selenoid
  3. $ docker pull selenoid/video-recorder
  4. $ docker pull selenoid/vnc:firefox_58.0

其中selenoid/video-recorder 用于录屏,selenoid/vnc:firefox_58.0为有VNC,火狐58版本的镜像,如果想获取更多支持的浏览器:
http://aerokube.com/selenoid/latest/#_browser_image_information

编写browsers.json 文件:

如下新建个browsers.json文件,配上你已经下载的浏览器版本的镜像,并放于宿主机的 /data/selenoid/config/ 路径下。

  1. {
  2. "chrome": {
  3. "default": "64.0",
  4. "versions": {
  5. "64.0": {
  6. "image": "selenoid/vnc:chrome_64.0",
  7. "port": "4444",
  8. "path": "/"
  9. }
  10. }
  11. },
  12. "firefox": {
  13. "default": "59.0",
  14. "versions": {
  15. "59.0": {
  16. "image": "selenoid/vnc:firefox_59.0",
  17. "port": "4444",
  18. "path": "/wd/hub"
  19. }
  20. }
  21. },
  22. "phantomjs":{
  23. "default": "2.1.1",
  24. "versions": {
  25. "2.1.1": {
  26. "image": "selenoid/phantomjs:2.1.1",
  27. "port": "4444",
  28. "path": "/"
  29. }
  30. }
  31. }
  32. }

启动:selenoid

执行如下命令:

  1. docker run -d --name selenoid \
  2. -p 14444:4444 \
  3. -v /data/selenoid/:/etc/selenoid/ \
  4. -v /var/run/docker.sock:/var/run/docker.sock \
  5. -v /data/selenoid/video/:/data/selenoid/video/ \
  6. -e OVERRIDE_VIDEO_OUTPUT_DIR=/data/selenoid/video/ \
  7. --privileged aerokube/selenoid:latest \
  8. -conf /etc/selenoid/config/browsers.json -limit 10 -video-output-dir /data/selenoid/video/

selenoid命令支持以下配置:

  1. -capture-driver-logs
  2. 是否向Selenoid输出添加驱动程序日志
  3. -conf String
  4. 浏览器配置文件(默认为“config / browsers.json”)
  5. -container -network String
  6. 用于容器的网络(默认为“default”)
  7. -cpu value
  8. 容器cpu限制为float,例如0.21.0
  9. -disable-docker
  10. 禁用docker 支持
  11. -disable-privileged
  12. 是否禁用特权容器模式
  13. -disable-queue
  14. 禁用等待队列
  15. -enable-file-upload
  16. 文件上传支持
  17. -limit int
  18. 同时容器运行(默认5
  19. -listen string
  20. 网络地址接受连接(默认为“4444”)
  21. -log-conf string
  22. 字符串容器日志记录配置文件(默认为“config / container-logs.json”)-
  23. -mem value
  24. 容器内存限制,例如128m1g
  25. -retry-count int
  26. 新会话尝试重试计数(默认值为1
  27. -service-startup-timeout duration
  28. 服务启动超时时间。持续格式(默认为30秒)
  29. -session-attempt-timeout持续时间
  30. 新会话尝试超时time.Duration格式(默认30秒)
  31. -session-delete-timeout duration
  32. 会话删除超时时间。持续格式(默认30秒)
  33. -timeout duration
  34. 持续时间会话空闲超时时间。持续格式(默认1m0s
  35. -version
  36. 显示版本并退出
  37. -video-output-dir String
  38. 将录制视频保存到(默认“video”)的目录
  39. -video-recorder-image string
  40. 用作录像机的images(默认为“selenoid / video-recorder”)

启动:selenoid-ui:

  1. docker run -d --name selenoid-ui -p 8080:8080 aerokube/selenoid-ui --selenoid-uri http://${SELENOID_HOST}:4444

编写测试脚本

  1. public void test6666() throws MalformedURLException, InterruptedException {
  2. DesiredCapabilities capabilities = new DesiredCapabilities();
  3. // 设置要启动的浏览器
  4. capabilities.setBrowserName("chrome");
  5. // 设置要启动的浏览器版本
  6. capabilities.setVersion("64.0");
  7. // 设置是否实时查看 默认false
  8. capabilities.setCapability("enableVNC", true);
  9. // 设置是否录制视频 默认false
  10. capabilities.setCapability("enableVideo", true);
  11. // 设置录制视频名称,可选,默认值为session ID
  12. capabilities.setCapability("videoName", "name");
  13. // 设置测试名称 可选
  14. capabilities.setCapability("name", "BOTeam");
  15. // 设置时区 可选
  16. capabilities.setCapability("timeZone", "Asia/Shanghai");
  17. // 设置标签名,用于标识 可选
  18. capabilities.setCapability("labels", "botest");
  19. RemoteWebDriver driver = new RemoteWebDriver(
  20. URI.create("http://localhost:14444/wd/hub").toURL(),
  21. capabilities
  22. );
  23. driver.manage().window().setSize(new Dimension(1980, 1080));
  24. driver.get("http://www.google.com");
  25. System.out.println(driver.getTitle());
  26. Thread.sleep(20000);
  27. driver.getWindowHandle();
  28. driver.quit();
  29. }

实时查看

打开selenoid-ui 界面:http://localhost:8080。
Docker 化的Selenium Grid - 图1

查看录制的视频

打开:http://localhost:14444/video/,选择视频并查看
Docker 化的Selenium Grid - 图2

查看使用统计

http://localhost:14444/status

添加浏览器

如果当前浏览器已经无法满足需求,可以手动需要添加浏览器,添加步骤如下:

  1. docker pull 需要的浏览器版本
  2. 修改browsers.json文件
  3. 重启 selenoid

Zalenium

Zalenium 简介

Zalenium 是一个Selenium Grid的扩展,同样带有视频录制,实时预览,基本认证和仪表盘等功能。也是使用docker-selenium在本地运行Firefox和Chrome中的测试,如果需要不同的浏览器,可以把测试重定向到云测提供商(Sauce Labs,BrowserStack,TestingBot)。 Zalenium也可以在Kubernetes中使用。
github:https://github.com/zalando/zalenium
官网:https://zalando.github.io/zalenium/

Zalenium 安装

Zalenium 安装前也得先安装Dcoker引擎,而且官方给了版本限制必须Docker Version >=1.11.1。

docker pull 相关镜像:

  1. $ docker pull elgalu/selenium
  2. $ docker pull dosel/zalenium

启动Zalenium

Docker 执行如下面命令:

  1. docker run -ti --name zalenium -p 4444:4444 \
  2. -v /var/run/docker.sock:/var/run/docker.sock \
  3. -v /tmp/videos:/home/seluser/videos \
  4. --privileged dosel/zalenium start --timeZone "Asia/Shanghai"

—timeZone “Asia/Shanghai” : 表示设置启动的容器的时区为上海时间,更多时区查看:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
/tmp/videos :为视频保存的宿主机路径

更多配置参数

名称 默认值 描述
--desiredContainers 2 启动时创建的node/容器的数量。
--maxDockerSeleniumContainers 10 Docker-selenium 同时运行的容器的最大数量。
--sauceLabsEnabled false 是否启动Sauce Labs节点。
--browserStackEnabled false 是否启动BrowserStack节点。
--testingbotEnabled false 是否启动TestingBot节点。
--startTunnel false 当启用云测试平台时,启动隧道以允许进行本地测试。请参阅每个提供商的文档以了解使用情况和所需的Selenium功能。[Sauce Labs][BrowserStack][TestingBot]创建隧道时使用的本地标识符是zalenium
--videoRecordingEnabled true 设置是否在每次测试中录制视频。
--screenWidth 1920 设置屏幕宽度。
--screenHeight 1080 设置屏幕高度。
--timeZone “Europe/Berlin” 设置容器中的时区。更多https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
--debugEnabled 启用LogLevel.FINE。
--seleniumImageName “elgalu /selenium” 启用覆盖要使用的Docker-selenium 镜像。
--gridUser - 允许指定用户启用基本身份验证保护。--gridPassword也必须提供。
--gridPassword - 允许指定密码以启用基本身份验证保护。--gridUser也必须提供。
--maxTestSessions 1 每个容器执行的最大测试数量。
--keepOnlyFailedTests false 只保存失败测试的视频(您需要发送包含测试结果的cookie)。

编写测试脚本

  1. @Test
  2. public void test1() throws MalformedURLException, InterruptedException {
  3. DesiredCapabilities capabilities = new DesiredCapabilities();
  4. capabilities.setBrowserName("chrome");
  5. String className = this.getClass().getName();
  6. String an = className + Thread.currentThread().getStackTrace()[1].getMethodName();
  7. // 设置录制视频name (可选)
  8. capabilities.setCapability("name", "testName");
  9. // 设置构建名 (可选)
  10. capabilities.setCapability("build", "BOTeam");
  11. // 启动容器的时区 (可选)
  12. capabilities.setCapability("timeZone", "Asia/Shanghai");
  13. RemoteWebDriver driver = new RemoteWebDriver(
  14. URI.create("http://localhost:4444/wd/hub").toURL(),
  15. capabilities
  16. );
  17. driver.manage().window().maximize();
  18. driver.get("http://www.google.com");
  19. System.out.println(driver.getTitle());
  20. driver.getWindowHandle();
  21. Thread.sleep(20000);
  22. driver.quit();
  23. }

实时查看

打开http://localhost:4444/grid/admin/live,我们可以看到如下,可以通过VNC查看到浏览器执行脚本情况。
Docker 化的Selenium Grid - 图3

查看录制的视频和log日志

打开:http://localhost:4444/dashboard/#
Docker 化的Selenium Grid - 图4

Docker 化的Selenium Grid - 图5


简单对比

对比项 Selenium Grid Selenoid Zalenium
实时预览 N Y Y
录屏 N Y Y
多版本浏览器 Y Y N (取决于Zalenium的版本)当然可以搭建多个版本的zalenium
多浏览器 Y Y N (除Chrome和Firefox外,其余需要用云服务)
log回溯 Y(但及其不方便) N Y
搭建难度 简单 复杂 简单
资源自动回收 N Y Y