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

  1. 进入 cmd 命令行终端

  2. 进入 selenium-server-4.3.0.jar 文件所在的目录 cd D:\SeleniumGrid\

  3. 启动 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 : 把日志写到指定路径指定文件
    
  4. 启动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 : 把日志写到指定路径指定文件
    
  5. 使用 http://localhost:3333 就可以显示 hub 的显示台:

    standalone的显示台:

    hub显示台

    hub:node1、node2显示台:

    hub显示台

  6. hub 的组件:

    • Event Bus:其他组件之间的通信路径
    • Session Map:负责将 session ID 映射到运行会话的节点(默认端口 5556)
    • New Session Queue:将新会话请求添加到队列中,然后让分发服务器处理它(默认端口 5559)。
    • Distributor:分发服务器(默认端口 5553)。
    • Router:Grid 的入口, 负责将请求定向到正确的组件(默认端口 4444,可以自己设,但要记住,访问 hub显示台就靠端口号了)。
  7. 了解了 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 并行测试

  1. 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
    
  2. 测试代码

    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()
    

运行结果:

image-20220807184924896

image-20220807185010057

OK ! 结束啦!最后,建议 hub节点 可以部署在一台虚拟机上,node节点 放在本机上,进行练习,不然都在本机上感觉不方便

posted @ 2022-08-07 19:07  南亭*.*  阅读(817)  评论(0编辑  收藏  举报