Selenium 包含 3 大组件,Selenium IDE、Selenium WebDriver、Selenium Grid。
Selenium IDE:负责录制、回放脚本,模拟用户对页面的真实操作。
Selenium WebDriver:提供 API 来操作浏览器。
Selenium Grid:用于分布式自动化测试,可以控制多台机器、多个浏览器并行执行测试用例。
先在服务器安装好docker服务,并建议设置好国内加速器(我用的是阿里)。
由于docker需要开启端口映射,所以服务器需要启用ipv4转发:
vim /etc/sysctl.conf
#添加以下配置
net.ipv4.ip_forward=1
#重启网络服务
systemctl restart network
#查看结果为1表示已开启
sysctl net.ipv4.ip_forward
1. 创建网络
docker network create grid
2. 创建hub容器(若不指定版本此过程会pull最新版本镜像并进行装载)
docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub
3. 创建node容器
docker run -d --net grid -e SE_EVENT_BUS_HOST =selenium-hub \
--shm-size= " 2g " \
-e SE_EVENT_BUS_PUBLISH_PORT=4442 \
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
--name selenium-node-chrme1 selenium/node-chrome
若需多个node,可重复执行以上命令,修改--name即可。
4. 查看镜像
5. 查看容器运行状态
6. 查看控制台
地址:http://IP地址:4444/ui/index.html#/
1. 在有互联网环境且安装docker的主机上pull镜像(若不指定版本则自动下载最新版本)
docker pull selenium/hub
docker pull selenium/node-chrome
docker images #查看到下载到本地的镜像。
2. 导出镜像
docker save -o node.tar selenium/node-chrome:latest
docker save -o hub.tar selenium/hub:latest
3. 将导出的tar上传到内网目标主机后进行导入
docker load -i node.tar
docker load -i hub.tar
4. 重复如上互联网环境下操作即可
Hub 和 Nodes 将创建在不同的机器/VM 上,它们需要知道彼此的 IP才能正常通信。如果多个节点将在同一机器/VM 上运行,则必须将它们配置为公开不同的端口。
在多台主机搭建与在同一主机内搭建Selenium集群步骤相似,只是在创建容器时参数不同。
1. 在主机A创建hub容器
docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub
2. 在主机B创建node容器1
docker run -d -p 5555:5555 \
--shm-size="2g" \
-e SE_EVENT_BUS_HOST=主机A的IP地址 \
-e SE_EVENT_BUS_PUBLISH_PORT=4442 \
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
-e SE_NODE_HOST=主机B的IP地址 \
-e SE_NODE_PORT=5555 \
selenium/node-chrome
3. 在主机B创建node容器2(需要修改容器2监听端口,避免冲突)
docker run -d -p 5556:5556 \
--shm-size="2g" \
-e SE_EVENT_BUS_HOST=主机A的IP地址 \
-e SE_EVENT_BUS_PUBLISH_PORT=4442 \
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
-e SE_NODE_HOST=主机B的IP地址 \
-e SE_NODE_PORT=5556 \
selenium/node-chrome
在有docker-compose的机器也可使用更简便的启动selenium grid。
# To execute this docker-compose yml file use `docker-compose -f docker-compose-v3.yml up`
# Add the `-d` flag at the end for detached execution
# To stop the execution, hit Ctrl+C, and then `docker-compose -f docker-compose-v3.yml down`
version: "3"
services:
chrome:
image: selenium/node-chrome:4.1.2-20220317
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
edge:
image: selenium/node-edge:4.1.2-20220317
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
firefox:
image: selenium/node-firefox:4.1.2-20220317
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium-hub:
image: selenium/hub:4.1.2-20220317
container_name: selenium-hub
ports:
- "4442:4442"
- "4443:4443"
- "4444:4444"
docker-compose up -d即可
我这里使用的Selenium 4.1版本,要求Python版本3.7+
python下载地址:Download Python | Python.org
下载后自行安装即可。
Selenium客户端驱动支持多种浏览器/驱动程序(Firefox、Chrome、Internet Explorer)以及远程协议。
若服务器可以访问互联网,可以使用pip进行安装
pip install selenium
若服务器无法访问互联网,可在有互联网的机器pip download下载,在内网主机pip进行安装即可。
或者在有互联网的同版本操作系统中将python环境准备好后,把python目录打包放到内网主机。
若不使用Selenium Grid,而是通过selenium webdirver来调用本地浏览器,则需要在本机安装浏览器驱动程序。主流浏览器驱动程序下载地址如下表:
Chrome: |
ChromeDriver - WebDriver for Chrome - Downloads |
Edge: |
Microsoft Edge WebDriver - Microsoft Edge Developer |
Firefox: |
Releases · mozilla/geckodriver · GitHub |
Safari: |
WebDriver Support in Safari 10 | WebKit |
下载完成后解压,将驱动程序放到$PATH中,如/usr/bin或/usr/local/bin。
unzip chromedriver_linux64.zip
mv chromedriver /usr/bin
windows同理。
若使用docker版本Selenium Grid,则不需要准备浏览器驱动程序,Selenium Grid镜像中已准备好对应的浏览器驱动程序。
seleniumdemo.py示例:
#coding=utf-8
from selenium import webdriver
selenium_grid_url = "http://XXXXXXXXXXXX:4444/wd/hub"
CHROME= {"browserName": "chrome"}
browser = webdriver.Remote(desired_capabilities=CHROME,command_executor=selenium_grid_url)
browser.get("http://fanyi.baidu.com")
browser.find_element_by_id("baidu_translate_input").send_keys("hello world")
print(browser.current_url)
browser.get_screenshot_as_file(r"/tmp/chrome.png")
browser.quit()
启动 python demo
python3 seleniumdemo.py
可以在控制台看到正在执行任务
执行完成后,可以查看截图如下(demo里没有写关闭提示框,但实际已经翻译了的):
在浏览器执行过程中,我们可以远程进行观看与调试,selenium提供了VCN客户端与浏览器两种远程方式。
VNC服务器默认监听端口为5900,在启动容器时需要添加参数-p 5900:5900将内部端口5900映射到外部端口。
然后就可以使用VNC客户端进行连接,默认密码为secret。
NoVNC服务器默认监听端口为7900,在启动容器时需要添加参数-p 7900:7900将内部端口7900映射到外部端口。
然后就可以使用浏览器进行连接,默认密码为secret。
--shm-size="2g" ,/dev/shm分区大小,默认64MB,官方建议配置为2GB
-e SE_EVENT_BUS_HOST= ,hub服务器地址 -e SE_EVENT_BUS_PUBLISH_PORT= , hub服务器的发布端口 -e SE_EVENT_BUS_SUBSCRIBE_PORT= , hub服务器的发布端口 -e SE_NODE_HOST= ,node服务器主机
-e SE_NODE_PORT= ,node服务器端口
-e SCREEN_WIDTH= ,屏幕分辨率宽度
-e SCREEN_HEIGHT= ,屏幕分辨率高度
-e SCREEN_DEPTH= ,颜色深度
-e SCREEN_DPI= ,屏幕DPI
-e START_XVFB=false , 以无头模式运行
-e SE_SESSION_REQUEST_TIMEOUT=, 请求队列超时时间
-e SE_SESSION_RETRY_INTERVAL= ,请求队列重试时间
-e SE_NODE_MAX_SESSIONS = ,调整node容器内最大session数,默认为1,若输入数值超过cpu核数,此值会自动设置为cpu核数,若想解除受cpu核心数限制,需要添加以下参数
-e SE_NODE_OVERRIDE_MAX_SESSIONS=true,解除sessions最大限制
参考文章:
Docker-Selenium Github 地址: GitHub - SeleniumHQ/docker-selenium: Docker images for the Selenium Grid Server
Selenium Github地址:GitHub - SeleniumHQ/selenium: A browser automation framework and ecosystem.
Selenium 客户端驱动官方文档:Selenium Client Driver — Selenium 4.1.0 documentation
Selenium API文档:Selenium Documentation — Selenium 4.1.0 documentation