Selenium Grid
Selenium 用于自动化测试,但是只能运行在本地环境中,即启动本地浏览器进行测试任务。而通过 Selenium Grid 集群,可以在多台远程主机中同步执行自动化测试任务。
如图所示,Client 连接 Hub 并发送任务,然后 Hub 将测试任务下发到 Node 进行执行(摘自 Selenium Grid 3 文档):
在该笔记中,我们将介绍如何搭建 Selenium Grid 3 环境,并编写最简单的演示程序。
注意事项,官方不再支持 Grid 3 版本,官方建议使用 Grid 4 版本。但是目前(08/30/2020)Grid 4 的文档并不完善,并且 Grid 3 的实践经验较多,因此我们使用 Selenium Grid 3 版本。
第一步、搭建 Seleium Grid 集群
Hub: 172.31.253.49, CentOS Linux release 7.5.1804 (Core)
Node: 172.31.253.103, Ubuntu 20.04 LTS
运行 Hub 节点
yum install -y java-1.8.0-openjdk mkdir -pv /srv/selenium-hub && cd /srv/selenium-hub wget https://selenium-release.storage.googleapis.com/3.141/selenium-server-standalone-3.141.59.jar # 配置 systemd 服务 cat > /etc/systemd/system/selenium-hub.service <<EOF [Unit] Description=Selenium Grid Hub [Service] Type=simple User=root ExecStart=/usr/bin/java -jar /srv/selenium-hub/selenium-server-standalone-3.141.59.jar -role hub -debug [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl start selenium-hub.service systemctl enable selenium-hub.service # 查看服务运行信息 journalctl -f -u selenium-hub.service
当服务运行成功后,在日志中将看到类似如下信息:
Started Selenium Grid Hub. Starting Selenium Grid Hub... 23:02:46.538 INFO [GridLauncherV3.parse] - Selenium server version: 3.141.59, revision: e82be7d358 23:02:46.739 INFO [GridLauncherV3.lambda$buildLaunchers$5] - Launching Selenium Grid hub on port 4444 2020-08-29 23:02:47.289:INFO::main: Logging initialized @1155ms to org.seleniumhq.jetty9.util.log.StdErrLog 23:02:47.596 INFO [Hub.start] - Selenium Grid hub is up and running 23:02:47.597 INFO [Hub.start] - Nodes should register to http://172.31.253.49:4444/grid/register/ 23:02:47.598 INFO [Hub.start] - Clients should connect to http://172.31.253.49:4444/wd/hub
运行 Node 节点
远程主机需要运行桌面环境。如果无法运行桌面环境,可以使用 xvfb 服务。为了简化问题与演示,我们使用桌面环境。
进入桌面环境,输入用户名密码进行登录(这里不再赘述详细过程)。
apt-get install chromium chromium-chromedriver # 运行 node 服务 apt-get install openjdk-8-jdk mkdir -pv /srv/selenium-node && cd /srv/selenium-node wget https://selenium-release.storage.googleapis.com/3.141/selenium-server-standalone-3.141.59.jar java -jar /srv/selenium-node/selenium-server-standalone-3.141.59.jar -role node -hub http://172.31.253.49:4444 # 这里没有介绍开机启动的方法 # 可以使用 xdg autostart 进行(详细过程不再赘述,通常是在 ~/.config/autostart 添加 .desktop 文件)
访问 http://172.31.253.49:4444/grid/console 查看注册到 Selenium Hub 的 Selenium Node 节点
附加说明:如果无法运行桌面环境,可以研究 xvfb xvnc 等等工具。
第二步、编写测试任务,并执行
from selenium import webdriver driver = webdriver.Remote( command_executor='http://172.31.253.49:4444/wd/hub', desired_capabilities={'browserName': 'chrome', 'javascriptEnabled': True}) driver.get("https://example.com")
在正常情况下,我们测试程序连接 172.31.253.49(Hub),将控制远程主机 172.31.253.103(Node)启动 Chromium 浏览器,并打开 example.com 页面。
附加说明
在启动 Hub 与 Node 服务时,除了在命令行指定配置参数,还可以使用 JSON 配置文件,更多细节请参考官方 Setting up your own :: Documentation for Selenium 文档(我们的笔记只记录最简单的操作)
另外,本地运行 Selenium 的自动化测试场景不多,多数场景需要在 Selenuim Grid 中执行自动化测试,因此我们的实例代码也以能在 Selenium Grid 中运行为准,但是运行在 Selenium 中的代码与运行在 Selenium Grid 中的代码差别并不大。
参考文献
Grid :: Documentation for Selenium
A simple tutorial of using selenium grid in python unittests