Zalenium 是一个Selenium Grid的扩展,它使用docker-selenium在本地运行基于Firefox和Chrome的测试,同样带有视频录制,实时预览,基本认证和仪表盘等功能;如果需要其他的浏览器,则需要用到云测试提供商(Sauce Labs,BrowserStack,TestingBot),当然这些是收费的。。。不过好在Firefox和Chrome是开源的,基本已经够用了; Zalenium也可以在Kubernetes中使用。
- Docker version >= 1.11.1(可能适用于低版本,没有测试过)
- 运行
docker info
不会报错
docker pull elgalu/selenium
docker pull dosel/zalenium
下载成功后运行:
docker run --rm -ti --name zalenium -p 4444:4444 -v /var/run/docker.sock:/var/run/docker.sock -v /temp/videos:/home/seluser/videos --privileged dosel/zalenium start
默认只启动一个chrome container和一个Firefox container,如需启动多个则运行(添加参数--desiredContainers 4
):
docker run --rm -ti --name zalenium -p 4444:4444 -v /var/run/docker.sock:/var/run/docker.sock -v /temp/videos:/home/seluser/videos --privileged dosel/zalenium start --desiredContainers 4
查看zalenium的参数用-h --help
:
docker run --rm -ti --name zalenium -p 4444:4444 -v /var/run/docker.sock:/var/run/docker.sock -v /temp/videos:/home/seluser/videos --privileged dosel/zalenium start -h
等待zalenium准备,调用:http://localhost:4444/wd/hub/status 你将会看到类似如下返回值:
{
"status": 0,
"value": {
"ready": true,
"message": "Hub has capacity",
"build": {
"revision": "unknown",
"time": "unknown",
"version": "3.141.59"
},
"os": {
"arch": "amd64",
"name": "Linux",
"version": "4.9.125-linuxkit"
},
"java": {
"version": "1.8.0_212"
}
}
}
然后你将会看到:
- 命令行窗口
- Grid: http://localhost:4444/grid/console
- 实时预览:http://localhost:4444/grid/admin/live,可以增加
?refresh=numberOfSeconds
,自动刷新页面,例如:http://localhost:4444/grid/admin/live?refresh=20;`?build=myTestBuild`,查看单个构建,例如:http://localhost:4444/grid/admin/live?build=myTestBuild - Dashboard:http://localhost:4444/dashboard/#
或者可以用Docker Compose启动zalenium,docker-compose.yml
样例:
# Usage:
# docker-compose up --force-recreate
version: '2.1'
services:
#--------------#
zalenium:
image: "dosel/zalenium"
container_name: zalenium
hostname: zalenium
tty: true
volumes:
- /tmp/videos:/home/seluser/videos
- /var/run/docker.sock:/var/run/docker.sock
# - /usr/bin/docker:/usr/bin/docker
ports:
- 4444:4444
command: >
start --desiredContainers 2
--maxDockerSeleniumContainers 8
--screenWidth 800 --screenHeight 600
--timeZone "Europe/Berlin"
--videoRecordingEnabled true
--sauceLabsEnabled false
--browserStackEnabled false
--testingBotEnabled false
--cbtEnabled false
--startTunnel false
environment:
- HOST_UID
- HOST_GID
创建docker-compose.yml
文件后,该文件目录下运行:docker-compose up
即可看到上文描述的结果。
caps = {'platform': 'ANY',
'browserName': "chrome",
'version': '',
# 是否录制视频
'recordVideo': True,
# build 名字
'build': "my_build_name123",
# 测试名称
'name': 'my_test_name123',
# 超时时间
'idleTimeout': 90,
# 分辨率
'screenResolution': '1280x720',
# 时区
# 'tz': 'Asia/Shanghai',
# 视频文件名称
'testFileNameTemplate': '{platform}_{browser}_{testStatus}_{timestamp}',
}
# 标记测试成功、失败
driver.add_cookie({"name": "zaleniumTestPassed", "value": "true"})
# 每一步在视频中添加注释
driver.add_cookie({"name": "zaleniumMessage", "value": "go to baidu page"})
- Python环境
pip insatll -U selenium
安装完毕后,运行脚本:
# coding=utf-8
# auther:lucas
# date:2019/7/1 17:40
# tools:PyCharm
# time zone: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
import unittest
from selenium import webdriver
class MyTestCase(unittest.TestCase):
def setUp(self):
ds = {'platform': 'ANY',
'browserName': "chrome",
'version': '',
'recordVideo': True,
'build': "my_build_name123",
'name': 'my_test_name123',
'idleTimeout': 90,
'screenResolution': '1280x720',
# 'tz': 'Asia/Shanghai',
'testFileNameTemplate': '{platform}_{browser}_{testStatus}_{timestamp}',
}
self.dr = webdriver.Remote('http://localhost:4444/wd/hub', desired_capabilities=ds)
def test_something(self):
self.dr.get("https://www.baidu.com")
self.dr.add_cookie({"name": "zaleniumMessage", "value": "go to baidu page12"})
self.assertEqual(self.dr.name, "chrome")
def test_search_button(self):
self.dr.get("https://www.baidu.com")
self.dr.add_cookie({"name": "zaleniumMessage", "value": "go to baidu page"})
self.dr.add_cookie({"name": "zaleniumMessage", "value": "input keyword"})
self.dr.find_element_by_id("kw").send_keys("zalenium")
self.dr.add_cookie({"name": "zaleniumMessage", "value": "click search button"})
self.dr.find_element_by_id("su").click()
self.assertTrue(self.dr.find_element_by_id("su").is_displayed())
def tearDown(self):
print(self.dr.get_cookies())
self.dr.add_cookie({"name": "zaleniumTestPassed", "value": "true"})
self.dr.quit()
if __name__ == '__main__':
unittest.main()
运行完将会通过上面的Dashboard和实时预览即可看到结果(视频可能需要等一下才可以生成) 关于并发的脚本:
# coding=utf-8
# auther:Liul5
# date:2019/7/12 10:50
# tools:PyCharm
# Python:3.7.3
import threading
from selenium import webdriver
import time
caps = {'platform': 'ANY',
'browserName': None,
'version': '',
# "enableVNC": True,
# 'javascriptEnabled': True,
'recordVideo': True,
'build': "build_%s" % time.strftime("%Y-%m-%d_%H-%M-%S", time.gmtime()),
'name': 'test_%s' % time.strftime("%Y-%m-%d_%H-%M-%S", time.gmtime()),
'idleTimeout': 90,
'screenResolution': '1280x720',
# 'tz': 'Asia/Shanghai',
# 'tz': 'America/Montreal',
'testFileNameTemplate': '{platform}_{browser}_{testStatus}_{timestamp}',
# 'name': 'my_test_name',
}
def run_browser(browser="chrome"):
if browser.lower() == "chrome":
caps['browserName'] = "chrome"
if browser.lower() == "firefox":
caps['browserName'] = "firefox"
# print(caps)
dr = webdriver.Remote('http://localhost:4444/wd/hub', desired_capabilities=caps)
dr.get("https://www.baidu.com")
dr.add_cookie({"name": "zaleniumMessage", "value": "go to baidu page"})
dr.add_cookie({"name": "zaleniumMessage", "value": "input keyword"})
dr.find_element_by_id("kw").send_keys("zalenium")
dr.add_cookie({"name": "zaleniumMessage", "value": "click search button"})
dr.find_element_by_id("su").click()
print(dr.find_element_by_id("su").is_displayed())
threads = []
temp_thrad = threading.Thread(target=run_browser, args=())
temp_thrad1 = threading.Thread(target=run_browser, args=("firefox",))
threads.append(temp_thrad)
threads.append(temp_thrad1)
for t in threads:
t.setDaemon(True)
t.start()
for i in threads:
i.join()
- GitHub: https://github.com/zalando/zalenium
- 官网:https://opensource.zalando.com/zalenium/
- docker-selenium 录屏:https://github.com/elgalu/docker-selenium/blob/master/docs/videos.md
- 实时预览集成jenkins:http://www.testautomationguru.com/embedding-zalenium-live-execution-in-jenkins/
- https://devopsqa.wordpress.com/2018/11/20/zalenium-docker-selenium-grid/
- https://dev.to/bufferings/tried-zalenium-to-run-selenium-tests-on-scalable-containers-2n7c
- http://www.testautomationguru.com/selenium-webdriver-disposable-selenium-grid-infrastructure-setup-using-zalenium/
- https://medium.com/@tuliobluz/zalenium-brief-introduction-with-protractor-5d9e4f5f85cb
- https://automationcalling.com/2018/07/09/cross-browser-parallel-automation-test-on-local-remote-and-cloud-using-zalenium/