写点什么

测试开发 | 跨平台设备管理方案 Selenium Grid

  • 2023-01-12
    北京
  • 本文字数:2997 字

    阅读完需:约 10 分钟

​Selenium Grid 是 Selenium 的三大组件之一,它可以在多台机器上并行运行测试,集中管理不同的浏览器版本和浏览器配置。通过将客户端命令发送到远程浏览器的实例, Selenium Grid 允许在远程计算机 (虚拟或真实) 上执行 WebDriver 脚本. 它旨在提供一种在多台计算机上并行运行测试的简便方法。


官方文档:https://www.selenium.dev/


使用场景场景一: 实现分布式执行测试,提高执行效率


比如:我们有 1000 条用例执行,如果在本机执行,一条用例耗时 100 秒,执行完成则需要大约 27 小时 1000*100/60/60=27 个小时。如果让这些用例并发执行,比如分配 6 台计算机,每个计算机执行 1000/6 大约 166 条用例,那时间大约节省了 6 倍,原来需要大约 27 个小时,现在可能只需要 4.5 个小时左右就基本完成了, 分布式并发执行可以让我们用例的执行总时长指数级的缩小,从而效率得到很大的提升。


场景二: 解决浏览器兼容性问题


比如还是 1000 条用例,需要分别在 Chrome、Firefox、Edge、Safari 这些浏览器上都执行一遍,保证每个浏览器上都能正常执行,测试浏览器的兼容性。这时也可以使用 Selenium Grid,通过 Selenium Grid 将这些请求分发到不同的系统、不同浏览器中执行。这些浏览器可以分别布署在不同的计算机中比如可以布署在 Linux 、Windows、Mac 上都可以,作为它的 Node 结点,从而解决兼容性测试的问题


新特性 Selenium Grid 4 是一个全新的工具,它能够支持完全分布式的测试。Selenium Grid4 也兼容了之前 Selenium Grid3 的工作模式,在 Selenium Grid3 的基础上又添加了一些新的通讯方式,使它通讯速度更快。另外现在很多公司都支持容器化部署,Selenium Grid 4 也提供了的 Docker 支持。相比 Selenium Grid 3,Selenium Grid 4 更容易在虚拟机上使用。


Selenium Grid4 有三个新特性


原理分析下面这张图是官方提供的 Selenium Grid4 的工作原理图:


从图中可以看到 Selenium Grid 包括六大组件,分别是:


下面分别说一下这六个组件所负责的职责:


环境安装


运行方式单机运行 - 独立模式


  1. 命令行启动 server


cd Desktop


java -jar selenium-server-4.4.0.jar standalone


  1. 代码运行


直接运行代码,发现在本地运行单线程,只不过通过 Selenium Grid 来转发请求。


运行步骤


单浏览器运行代码


示例代码如下:


"""@Author: 霍格沃兹测试开发学社-西西 @Desc: '更多测试开发技术探讨,请访问:https://ceshiren.com/t/topic/15860'"""from time import sleepfrom selenium import webdriverfrom selenium.webdriver.common.by import By


class TestSingleNode:def setup_method(self):# 创建 Options ,新版本 DesireCapability 已弃用 options = webdriver.EdgeOptions()# 通过 URL 和 options 创建一个远程的连接 # client 发送请求,要发送给 selenium grid hub 结点, hub 结点会将请求分发到对应的 node


    self.driver = webdriver.Remote(        command_executor='http://10.1.1.104:4444',        options=options    )
def test_singlenode1(self): # 打开 baidu 页 self.driver.get("http://www.baidu.com") # 向输入框中输入 self.driver.find_element(By.ID, 'kw').send_keys("firefox") # 点击搜索框 self.driver.find_element(By.ID, 'su').click() # 等待一秒 sleep(1) # 断言输入内容在页面中 assert "firefox" in self.driver.page_source
def teardown_method(self): self.driver.quit()
复制代码


多浏览器运行代码


创建测试文件 test_multi_node.py 示例代码如下:


from time import sleepfrom selenium import webdriverfrom selenium.webdriver.common.by import By


class TestMultiNode:def setup_method(self):options = webdriver.ChromeOptions()self.driver = webdriver.Remote(command_executor='http://10.1.1.104:4444',options=options)


def test_multinode1(self):    # 打开 baidu 页    self.driver.get("http://www.baidu.com")    # 向输入框中输入    self.driver.find_element(By.ID, 'kw').send_keys("selenium")    # 点击搜索框    self.driver.find_element(By.ID, 'su').click()    # 等待一秒    sleep(1)    # 断言输入内容在页面中    assert "selenium" in self.driver.page_source
def test_multinode2(self): # 打开 baidu 页 self.driver.get("http://www.baidu.com") # 向输入框中输入 self.driver.find_element(By.ID, 'kw').send_keys("appium") # 点击搜索框 self.driver.find_element(By.ID, 'su').click() # 等待一秒 sleep(1) # 断言输入内容在页面中 assert "appium" in self.driver.page_source
def test_multinode3(self): # 打开 baidu 页 self.driver.get("http://www.baidu.com") # 向输入框中输入 self.driver.find_element(By.ID, 'kw').send_keys("pytest") # 点击搜索框 self.driver.find_element(By.ID, 'su').click() # 等待一秒 sleep(1) # 断言输入内容在页面中 assert "pytest" in self.driver.page_source
def test_multinode4(self): # 打开 baidu 页 self.driver.get("http://www.baidu.com") # 向输入框中输入 self.driver.find_element(By.ID, 'kw').send_keys("requests") # 点击搜索框 self.driver.find_element(By.ID, 'su').click() # 等待一秒 sleep(1) # 断言输入内容在页面中 assert "requests" in self.driver.page_source
def test_multinode5(self): # 打开 baidu 页 self.driver.get("http://www.baidu.com") # 向输入框中输入 self.driver.find_element(By.ID, 'kw').send_keys("java") # 点击搜索框 self.driver.find_element(By.ID, 'su').click() # 等待一秒 sleep(1) # 断言输入内容在页面中 assert "java" in self.driver.page_source
def teardown_method(self): self.driver.quit()
复制代码


为了模拟多浏览器并发运行,使用 pytest 的插件 pytest-xdist 实现分布式并发执行方式,提前安装 pytest-xdist 插件,然后使用命令执行用例。打开命令提示行或者终端,使用 cd 命令进入到文件所在路径,然后执行 pytest test_multi_node.py -n 3 --alluredir ./results 命令。执行完用例之后,会把测试报告结果统一汇总到 results 目录中。


单机运行 - 经典网格模式


  1. 命令行启动 hub


cd Desktop


java -jar selenium-server-4.4.0.jar hub


3. 查看状态的 UI 界面:


  1. 命令行启动 node


java -jar selenium-server-4.4.0.jar node --detect-drivers true


此时 node 节点创建成功,并且 hub 上注册对应 node 节点:


  1. 再次查看状态的 UI 界面:

  2. 代码运行


直接运行代码,发现在本地运行单线程,只不过通过 Selenium Grid 来转发请求。


多系统运行 - 分发模式在经典网格模式等基础上再在其他机器上启动一个 node 角色。


  1. 不同机器上启动 node


java -jar selenium-server-4.4.0.jar node --detect-drivers true --publish-events tcp://10.1.1.178:4442 --subscribe-events tcp://10.1.1.178:4443


注意⚠️:不同机器上启动的时候需要安装相同版本的 jar 及根据机器上的浏览器下载对应的 driver


  1. 不同机器上运行用例


使用代码运行时会发现对应分发时会分给不同的系统运行代码,如图:


​​



用户头像

社区:ceshiren.com 微信:ceshiren2021 2019-10-23 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料,实时更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬。

评论

发布
暂无评论
测试开发 | 跨平台设备管理方案 Selenium Grid_霍格沃兹测试开发学社_InfoQ写作社区