selenium Grid 4.x版本 部署操作
selenium Grid 4.x版本 部署操作(小白笔记)
selenium Grid 是 selenium套件 的一部分,实现分布式测试,多用于浏览器兼容性测试。
使用 hub-nodes 理念:一台 hub 控制机节点,多台 nodes 负载机节点。
前置条件:(1)已经部署了 JDK;(2)已经下载好了各个浏览器的webdriver驱动器(Grid会自动识别本电脑上的驱动)
# 各个浏览器驱动下载地址:
chrome:https://chromedriver.chromium.org/downloads
firefox:https://github.com/mozilla/geckodriver/releases
edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
IE:https://www.selenium.dev/downloads
safari:内置了,不用另外下载
# 下载好后,放到 Python 安装目录的 Scripts目录
注意:如果您想要部署 3.x版本,这儿有两位前辈的文章值得参考:Selenium Grid分布式测试入门详解 - lovesoo - 博客园 (cnblogs.com) 和 selenium Grid详解 - 习久性成 - 博客园 (cnblogs.com)
一、下载与selenium库的版本对应的selenium Grid版本
查看 selenium 版本:进入cmd命令行终端输入 pip show selenium
selenium Grid 下载地址:https://www.selenium.dev/downloads/
往下找往期版本:
4.x版本下载:
我下载 4.3版本的Grid selenium-server-4.3.0.jar
进行演示
二、启动及配置selenium Grid
-
进入 cmd 命令行终端
-
进入
selenium-server-4.3.0.jar
文件所在的目录cd D:\SeleniumGrid\
-
启动 standalone --hub:(最简单模式)
java -jar selenium-server-4.3.0.jar standalone --hub localhost --port 3333 --max-sessions 10 --log D:\SeleniumGrid\gridLog.log # standalone:意思是独立运行(我也没搞清是什么意思),让 hub 自己独立运行,不能添加 node # --hub : 表示此机器启动hub节点,后边跟hub主机的IP地址 # --port : 此参数后跟端口号;设置启动 hub 或 node 服务的端口号;默认端口是4444,也可以自己设置 netstat -ano | findstr "3333" # 可以查看Windows的“4444”端口有没有被占用 # --max-sessions : 设置最大会话请求数,默认最大会话请求数是16 # -I : 指定浏览器 # --log : 把日志写到指定路径指定文件
-
启动hub和node:(适合中型和小型并发)
# 查看Windows的“4444”端口有没有被占用 netstat -ano | findstr "4444" # 启动hub java -jar selenium-server-4.3.0.jar hub --host localhost --port 3333 --log D:\SeleniumGrid\gridLog.log # hub : 启动hub节点 # --host : 跟hub的主机名/IP地址 # --port : 此参数后跟端口号;设置启动 hub 的端口号;默认端口是4444,也可以自己设置 # --max-threads : 最大线程数,默认是 可用处理器*3 # --log : 把日志写到指定路径指定文件 # 启动node java -jar selenium-server-4.3.0.jar node --hub http://localhost:3333 --port 4444 --max-sessions 10 -I firefox --log D:\SeleniumGrid\node4444.log java -jar selenium-server-4.3.0.jar node --hub http://localhost:3333 --port 5555 --max-sessions 10 -I edge -I chrome --log D:\SeleniumGrid\node5555.log # --hub : 后边跟hub主机的url,意思就是为哪个hub打开的node # --port : 此参数后跟端口号;设置启动 node 服务的端口号;默认端口是5555,也可以自己设置 # --max-sessions : 设置最大会话请求数,默认最大会话请求数是16 # -I : 指定浏览器 # --log : 把日志写到指定路径指定文件
-
使用 http://localhost:3333 就可以显示 hub 的显示台:
standalone的显示台:
hub:node1、node2显示台:
-
hub 的组件:
- Event Bus:其他组件之间的通信路径
- Session Map:负责将 session ID 映射到运行会话的节点(默认端口 5556)
- New Session Queue:将新会话请求添加到队列中,然后让分发服务器处理它(默认端口 5559)。
- Distributor:分发服务器(默认端口 5553)。
- Router:Grid 的入口, 负责将请求定向到正确的组件(默认端口 4444,可以自己设,但要记住,访问 hub显示台就靠端口号了)。
-
了解了 hub 组件,就可以采用 Distributed 的方式启动 hub ,即分别启动各组件(各组件启动顺序很重要)(这种方式适合于大型并发,我觉得我这辈子应该是用不到了)
# 第一步启动: java -jar selenium-server-4.3.0.jar event-bus --log D:\SeleniumGrid\evenbus.log # 第二步启动: java -jar selenium-server-4.3.0.jar sessions --log D:\SeleniumGrid\sessions.log # 第三步启动: java -jar selenium-server-4.3.0.jar sessionqueue --log D:\SeleniumGrid\sessionqueue.log # 第四步启动: java -jar selenium-server-4.3.0.jar distributor --sessions http://localhost:5556 --sessionqueue http://localhost:5559 --bind-bus false --log D:\SeleniumGrid\distributor.log # --bind-bus : 当为false时,组件将连接到event-bus。当为ture时,组件将绑定到event-bus,由event-bus启动(通常由distributor和hub启动)。 # 第五步启动: java -jar selenium-server-4.3.0.jar router --port 3333 --sessions http://localhost:5556 --sessionqueue http://localhost:5559 --distributor http://localhost:5553 --log D:\SeleniumGrid\router.log
然后按正常启动 node 即可
三、Python+selenium Grid 并行测试
-
Python 多线程简述:
# Python 多线程要导入 threading 模块的 Thread 用于创建线程 from threading import Thread # Thread(target=被执行的函数名, args=给被执行的函数传递的参数(这个参数是元组形式)) # 创建两个线程 t1 = Thread(target=被执行的函数名1) t2 = Thread(target=被执行的函数名1) # 运行两个线程 t1.start() t2.start() t1.join() t2.join() # start 就是运行线程,join 等待这个线程运行完成,之后再执行主线程 # 一般创建线程,先将所有start,再将所有join
-
测试代码
from threading import Thread from selenium.webdriver import DesiredCapabilities, Remote from selenium.webdriver.common.by import By class GridTest(): def test_baidu(self, driver): driver.get('https://www.baidu.com/') driver.find_element(By.ID, 'kw').send_keys('王心凌') driver.find_element(By.ID, 'su').click() def node_driver(self, node): if node == "firefox": brother = DesiredCapabilities.FIREFOX.copy() driver = Remote(command_executor="http://localhost:3333", desired_capabilities=brother) elif node == "chrome": brother = DesiredCapabilities.CHROME.copy() driver = Remote(command_executor="http://localhost:3333", desired_capabilities=brother) driver.implicitly_wait(10) driver.maximize_window() self.test_baidu(driver) def runner(self): nodes_list = ['firefox', 'chrome'] thread_list = [] for browther in nodes_list: t = Thread(target=self.node_driver, args=(browther,)) thread_list.append(t) for t in thread_list: t.start() for t in thread_list: t.join() if __name__ == '__main__': GridTest().runner()
运行结果:
OK ! 结束啦!最后,建议 hub节点 可以部署在一台虚拟机上,node节点 放在本机上,进行练习,不然都在本机上感觉不方便
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧