什么是Selenium Grid
Selenium Grid是Selenium套件的一部分,它专门用于并行运行多个测试用例在不同的浏览器、操作系统和机器上。
Selenium Grid有两个版本——老版本Grid 1和新版本Grid 2。我们只对新版本做介绍,因为Selenium团队已经逐渐遗弃老版本了。
Selenium Grid 主要使用 master-slaves (or hub-nodes) 理念 --一个 master/hub 和多个 基于master/hub注册的子节点 slaves/nodes。当我们在master上基于不同的浏览器/系统运行测试用例时,master将会分发给适当的node运行。
什么时候用Selenium Grid
- 同时在不同的浏览器、操作系统和机器上运行测试。最大程度用于兼容性测试
- 减少运行时间
怎样启动Selenium Grid
1. 命令行启动
将会使用2台机器,一台运行hub另一台运行node
1、安装并运行selenium/hub:
docker run --name=hub -p 5001:4444 -e GRID_TIMEOUT=0 -e GRID_THROW_ON_CAPABILITY_NOT_PRESENT=true -e GRID_NEW_SESSION_WAIT_TIMEOUT=-1 -e GRID_BROWSER_TIMEOUT=15000 -e GRID_TIMEOUT=30000 -e GRID_CLEAN_UP_CYCLE=30000 -d selenium/hub:3.7.1-beryllium
2、安装并运行selenium/node-chrome-debug
docker run --name=chrome -p 5902:5900 -e NODE_MAX_INSTANCES=6 -e NODE_MAX_SESSION=6 -e NODE_REGISTER_CYCLE=5000 -e DBUS_SESSION_BUS_ADDRESS=/dev/null -v /dev/shm:/dev/shm --link hub -d selenium/node-chrome-debug:3.7.1-beryllium
在浏览器中打开hub地址 http://127.0.0.1:5001/grid/console ,会展示已经挂载到hub上的node节点
如果hub节点和node节点在同一服务器上可以用 --link参数指定hub即可,若hub与node不在同一节点,则需要另加HUB_PORT_4444_TCP_ADDR和HUB_PORT_4444_TCP_PORT参数
docker run --name=chrome2 -p 5903:5900 -e HUB_PORT_4444_TCP_ADDR=shifeng.online -e HUB_PORT_4444_TCP_PORT=5001 -e NODE_MAX_INSTANCES=6 -e NODE_MAX_SESSION=6 -e NODE_REGISTER_CYCLE=5000 -e DBUS_SESSION_BUS_ADDRESS=/dev/null -v /dev/shm:/dev/shm -d selenium/node-chrome-debug:3.7.1-beryllium --restart
--restart 参数会在容器异常时重启,比如hub被压挂了等,在搭建重要项目是都是加上该参数
打开远程hub地址
3、安装VNC远程浏览器环境
debug结尾的镜像都带有VNC服务端,本机安装VNC客户端,即可远程连接。
下载地址:https://www.realvnc.com/en/connect/download/viewer/
输入远程地址:127.0.0.1:5902
密码:secret
测试代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:chenshifeng
@file:test_grid.py
@time:2020/12/26
"""
import time
from selenium import webdriver
from selenium.webdriver import TouchActions
class TestGrid:
def setup_method(self):
self.driver = webdriver.Remote('http://127.0.0.1:5001/wd/hub')
self.driver.maximize_window()
self.driver.implicitly_wait(5)
def teardown_method(self):
self.driver.quit()
def test_grid(self):
self.driver.get("https://www.baidu.com/")
el = self.driver.find_element_by_id('kw')
el_search = self.driver.find_element_by_id('su')
el.send_keys('selenium测试')
action = TouchActions(self.driver)
action.tap(el_search) # 点击
action.perform()
action.scroll_from_element(el, 0, 10000).perform()
time.sleep(5)
运行结果截图