Docker selenium 结合 docker 构建分布式测试环境 (初学者视角)

徐旻 · 2017年05月04日 · 最后由 spook 回复于 2020年04月21日 · 5160 次阅读

前言:随着自动化测试越学越深,深深觉得有太多的东西需要总结,发布此贴的目的有 3 个。
1.记录下学习中遇到的坑,当做学习笔记。
2.有前人路过看到文章中比较落后的做法,请务必一定要指教。(因为是初学者视角,很多东西只是走通而已,不足的地方多的去了,无论谁的指教都会让我受益匪浅)
3.因为我就是一个初学者,所以我打算详细的记录操作步骤,争取和我一样的初学者看着这篇文章就可以成功搭建测试环境。

项目背景:
我负责的自动化 web 测试框架已经搭建完成了。框架主要主要使用了:
语言:python
测试框架:pytest
web 自动化:selenium
报告框架:allure
CI 集成:jenkins

引入 docker 的目的:
优化自动化测试框架。当 case 在单个浏览器上走通了以后,就开始考虑是否需要考虑下兼容性,反正都是机器跑,跑一个浏览器是跑,跑二个也是跑。刚开始的时候打算用 Selenium Standalone Server 解决这个问题,但是在社区里看到了 docker 文章。立刻被吸引到了,通过 docker 启动容器创建一个干净的测试环境,把外界因素对自动化测试的干扰降至最低。自动化测试稳定才是王道。

目标:
1.成功搭建 docker 结合 selenium 构建分布式测试环境。
2.编写脚本执行 web 的自动化测试分布式测试。

1.安装 docker

以前 docker 必须安装太 linux 系统上的,不过最近 docker 发布了 windows 的版本,至少让我这种没有 linux 操作环境的人也能使用 docker。
去 docker 官网下载 dockerToolbox.exe,然后直接安装即可。这个完全没有难度。
然后在启动或者找快捷方式 Docker Quickstart Terminal ,打开 docker 的 terminal。
第一次启动可能花费很长时间,耐心等待即可。看到下图就说明我们可以开始使用 docker 了。

2.获取 docker 镜像

按照我对 docker 理解,初学者就直接认为 docker 是一种轻量级的虚拟机,然后在虚拟机里搭建各种环境,在需要的时候,直接启动即可。docker 的根本就是镜像,任何操作的来源都是从镜像开始的,找到合适我们自己项目的镜像就可以了。
我们可以去 docker 的公共仓库找一些已经做好的镜像。
输入命令
docker search selenium
我们可以在公共仓库里找到关于 selenium 的镜像。
既然是分布式测试,那么我们就需要 hub,node。合适我们的镜像就被我们找到了。
hub:selenium/hub
node:selenium/node-firefox , selenium/node-chrome
node 有两种,一个是 firefox,一个 chrome。看来这两种浏览器是现在的主流,当然如果我们在将来的工作需要在 docker 上进阶,我们自己也可以构建 ie 之类的镜像,那就是后话了。
输入命令
docker pull selenium/hub
docker pull selenium/node-firefox
docker pull selenium/node-chrome
如果下载镜像不成功,就多试几次,再不行就 *** 再下载。
全部下载完成以后
输入命令
docker images
查看镜像列表

如上图显示的话,基本上就成功了。

3.运行 docker 镜像

我们已经下载好了 docker 的镜像,接下来就是运行镜像,在 docker 的世界里叫做启动容器,通俗点就是启动了虚拟机。

3.1 启动 selenium-hub

输入命令
docker run -p 5555:4444 -d --name hub selenium/hub
输入命令
docker ps
可以看到以下内容

我来解释下基本命令
run 是让我们运行一个镜像,创建出一个容器。
运行的镜像名字叫做 selenium/hub
-p 5555:4444 这个是把容器里的端口映射出来,让别人可以访问。
-d 在后台运行
--name 给这个容器起一个容易明白的名字,这里我就直接把这个容器成为 hub。

3.2 启动 selenium-node

输入命令
docker run -P -d --link hub:hub --name firefox selenimu/node-firefox
docker run -P -d --link hub:hub --name chrome selenimu/node-chrome
--link 是链接别名为 hub 的容器

输入命令 docker ps

然后在本机的浏览器中输入
http://192.168.99.100:5555/grid/console

这个页面相信大家都熟悉了。就是用 java 去启动 selenium-server-standalone-×××.jar,然后注册 node 到 selenium-server 上。
然而我们现在用 docker+selenium 也做到了这点。

输入命令
docker logs hub

我们可以通过 logs 查看 hub 容器内的日志。上图显示在 hub 上注册了两个 node

4.运行测试脚本

# coding=utf-8

from selenium import webdriver
chrome_capabilities ={
    "browserName": "chrome",
    "version": "",
    "platform": "ANY",
    "javascriptEnabled": True,
    # "marionette": True,
}
browser = webdriver.Remote("http://192.168.99.100:5555/wd/hub", desired_capabilities=chrome_capabilities)
browser.get("http://www.163.com")
browser.get_screenshot_as_file(r"D:/sample/chrome.png")
browser.quit()

这是一个典型的 python 的 selenium 脚本调试命令。
其中要注意的的以前在本机调试我们都是
browser = webdriver.Chrome()
但是我们现在 node 和 hub 的概念,所以我们在定义 webdriver 的时候是定义在 hub 上的。所以我们看到了
webdriver.Remote("http://192.168.99.100:5555/wd/hub", desired_capabilities=chrome_capabilities)

在本机上运行改脚本,没有很大问题应该会在制定的目录生成一张快照,证明我们脚本的确跑起来了。

5.debug 模式

我们在运行 docker 的时候是看不到任何界面的,但是有的时候为了 debug 方便,我们需要看容器里到底在干什么。
所以,docker-selenium 提供了 debug 模式。

首先我们要去下载 debug 专用的镜像
输入命令
docker pull selenium/node-chrome-debug
docker pull selenium/node-firefox-debug
如果如要本地调试的镜像
docker pull selenium/standalone-chrome-debug
docker pull selenium/standalone-firefox-debug

输入命令
docker run -d -p 5900:5900 --link hub:hub selenium/node-chrome-debug
我们在创建了 node 容器的同时把接口 5900 暴露出来了。
那么我们现在就要使用 vnc 进行连接。
我选择了 vnc viewer

如图所示,vnc server 输入 docker 的 ip 加上容器暴露出来的接口 5900
连接,会要求输入密码,默认密码就是 secret
进入 vnc viewer 就可以看到以下 Ubuntu 系统的图形界面。会 linux 的人肯定不会陌生。

在运行我们前面的调试脚本,这次就会在 vnc viewer 中的看到 selenium 整个操作过程。

以上我们应该就已经把 selenium 结合 docker 构建分布式测试环境配置好了,debug 模式也配置好了。
这些就是我的学习笔记。
在各种百度中发现其实我们的 testerhome 在 2015 年已经有了类似的文章了。
https://testerhome.com/topics/3367
但是在 docker 节点里我没有找到,不然可能会少踩很多坑。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 45 条回复 时间 点赞

谢谢,学习下

偶的错,当时写那篇 docker selenium 文章的时候更多的是关注 selenium 部分,所以没放在 docker 板块。我看到刚刚管理员已经移到 docker 板块了。

我最初也用官方镜像,不改字体,中文网站打开都是乱码,还是需要自己创建镜像。

自己创建镜像,比较折腾

workhard 回复

在启动 docker 的时候你会看到下图

里面就告诉你这个 docker-machine 被分配的 ip

当然你也可以在 docker 的终端里输入命令
docker-machine -ls
查看 ip

然后在启动 hub 的时候我们用的命令是
docker run -p 5555:4444 -d --name hub selenium/hub

也就是说对外界来说打开了 5555 端口。

两个联系起来我们就可以得到
http://192.168.99.100:5555

ps:刚开始的时候我也不知道这个网址是怎么来的,后来百度多了,突然看到启动的时候给的 ip,才明白的。有的时候还是要细心,要去发现。

Baozhida 回复

是的,马上我就要尝试自己构建 docker file。还是很期待,估计以后我的调试环境都会放到 docker 里。这样系统会显的很干净。
其实就是写 linux 的 shell 脚本,这样正好熟悉一下 linux 的命令。

非常不错,学习一下👍

多谢分享,学习了😂

—— 来自 TesterHome 官方 安卓客户端

@lunamagic

请问运行脚本的时候报这个错是什么原因呢?

徐旻 #11 · 2017年05月09日 Author
邢晖 回复

在执行
browser = webdriver.Remote("http://192.168.99.100:5555/wd/hub", desired_capabilities=chrome_capabilities)
的时候出错了。 可能这里涉及到 docker 容器的设定,可能需要你提供跟多的参数。 你方便的话加我 qq(1409378927),我可以帮你看看。

徐旻 回复

谢谢!问题已经解决了,原因在这里:https://github.com/SeleniumHQ/selenium/issues/3808
注释掉 webdriver.py 中的"capabilities": w3c_caps 就正常了。

徐旻 #23 · 2017年05月10日 Author
邢晖 回复

对于在提问的同时自己也在找解决方案的同学 致敬。你的是用 python3 写的?

徐旻 回复

不是,python 2.7

我是在 Linux 也同样弄过 docker+selenium 实现浏览器访问,不过没有你这么完整,这样做的确要干净,快捷的多,想想以前每次都折腾环境就觉得是泪

我有一个问题就是 selenium-firefox-debug 在 application 下面没有 firefox 的选项,chrome 没有问题,求解答

看了楼主的帖子,感觉自己对 Docker 又理解的更深了,感觉自己下一次再专攻 docker 的时候会理解的更容易点。
非常感谢楼主的分享~~~
之前有试过把 Raspberry PI 连接到 Android 上时,短暂接触过 vnc viewer,这里又一次看到它,感到好亲切。
做这一行真的会随着接触的东西一点点地联系起来而感到越来越开心啊,耶耶耶~~ 还要继续加油~

徐旻 #19 · 2017年06月19日 Author

我印象中的确 ff 和 chrome 有一个很快就找到了,有一个需要仔细的找一下,如果你下载的官方的镜像,肯定可以打开浏览器的。我现在出差,手上没有机器演示给你看。

徐旻 回复

下载的官方镜像,还是没找到😟

21楼 已删除
docker pull registry.cn-hangzhou.aliyuncs.com/bennyzmm/selenium-hub
Using default tag: latest
Pulling repository registry.cn-hangzhou.aliyuncs.com/bennyzmm/selenium-hub
Error: image bennyzmm/selenium-hub:latest not found

楼主请问下,设置了 docker run -d -p 5900:5900 --link hub:hub selenium/node-chrome-debug 后,怎么启动 vnc viewe?

徐旻 #24 · 2017年06月27日 Author
fdeferf 回复

不是 selenium-hub 是 selenium/hub

徐旻 #25 · 2017年06月27日 Author

这个估计是输入命令出错了吧。官方的镜像我昨天刚下了一个 mysql。或者你是没有 ***,被挡住了?
docker pull selenium/hub
docker pull selenium/node-firefox
docker pull selenium/node-chrome

徐旻 #26 · 2017年06月27日 Author

请看 5.debug 模式,有张图片专门解释 vnc 怎么配置的。

徐旻 回复


我启动的是 debug 的,不是默认 debug 的才能打开浏览器吗,我 debug 的 chrome 打开没问题,就是 firefox 的没有,求楼主正确打开方式

徐旻 #35 · 2017年06月27日 Author

你尝试 启动 docker 的时候制定下端口,可能你两个都用了 5000 , 你尝试一个 5000,一个 5001,再去试试看。

徐旻 回复

用同一个端口肯定会报错啊,能用 vnc 进到里面说明启动没有错,只是进去之后没法看到浏览器

徐旻 #37 · 2017年06月29日 Author

这种就是 linux 的基础问题,百度一下就解决了。还是要学会 baidu,google。
https://zhidao.baidu.com/question/485606077.html

徐旻 回复

完全没想到用命令行启动😛 谢谢楼主耐心了

楼主你好。我 debug 启动浏览器浏览器有个黄色表示 chromedriver You are using an unsupported command-line 这个怎么解决你】呢?不会自动输入网址的

支持一个👍

期待后续

学习了

徐旻 #37 · 2017年07月11日 Author
尹全旺 回复

这个我还真没有遇上,普通来说都是用 docker 启动的话,内部的环境应该是一样的。不应该会出现这种情况。docker 就是为了避免大家的环境不一样造成 莫名其妙的问题。

你好,我安装完毕启动 docker 后,到如图就走不下去了,没看出是什么问题,麻烦帮忙看下

徐旻 #39 · 2017年08月03日 Author
周小丽 回复

这个是 docker 都没有启动起来。 我没有在 windows 上使用过 docker ,不好意思,帮不了你。


楼主大神 你好 ,我刚学 docker,帮我看看 ,为啥提示我需要注册?

徐旻 #41 · 2018年02月02日 Author
蜗牛看书 回复

你的是 hub 中显示的,看英文意思就是 节点将会被注册在 172.17.0.2:4444 上,等你把 node-chrome 运行后,你会看到:
07:07:06.244 INFO - Nodes should register to http://172.17.0.2:4444/grid/register/
07:07:06.244 INFO - Selenium Grid hub is up and running
07:08:27.517 INFO - Registered a node http://172.17.0.3:5555
node-chrome 被注册了,节点的 ip 是 172.17.0.3:5555

45楼 已删除

docker run -P -d --link hub:hub --name firefox selenimu/node-firefox
docker run -P -d --link hub:hub --name chrome selenimu/node-chrome
错了 是 selenium

simple docker + selenium + jenkins 并行跑自动化测试 中提及了此贴 12月14日 10:40
仅楼主可见

感谢楼主的教程,我有一个问题就是,如果 hub 中有两个 node 中浏览器版本是一样的,如何指定某个 node 来执行呢?

docker run -P -d --link hub:hub --name chrome selenimu/node-chrome

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册