• 学点Selenium玩点新鲜~,让分布式测试有更多玩法


     前  言

    我们都知道 Selenium 是一款在 Web 应用测试领域使用的自动化测试工具,而 Selenium Grid 是 Selenium 中的一大组件,通过它能够实现分布式测试,能够帮助团队简单快速在不同的环境中测试他们的 Web 应用。

    分布式执行测试其实并不是一个非常难以理解的概念,简单来说,就是能够同时在不同的环境中同时执行测试。通过 Selenium Grid,我们可以通过在客户端发送命令到远程端的浏览器实例,在远程端执行 WebDriver 脚本,可以在多台远程的机器上并行运行测试。

    Selenium Grid 4 新特性介绍

    在以往的 Selenium Grid 版本中(V1-V3)其架构都比较简单。在全新的 Selenium Grid 4 版本中其架构变得有些复杂,但也更加灵活和强大了。

    特性一:Hub 和 Node 使用同一个 jar 服务
    在之前,我们要配置 Selenium Grid 时需要分别启动 Hub 和 Node 节点,而在全新的 Selenium Grid 4 版本中 Hub 和 Node 都是用同一个 jar 文件,一旦服务启动之后将会同时作为 Hub 和 Node 角色。

    特性二:架构优化
    在之前的 Selenium 版本中,Selenium Grid 由 Hub 和 Node 组成,Hub 作为总控中心负责 Node 节点注册及转发请求,Node 节点则负责来自 Hub 的请求及执行测试脚本,具体参考我之前的文章 Selenium Grid- 让自动化分布式执行变得可能

    图片

     在 Selenium Grid 4 版本的全新架构中划分成了组件:Router、Distributor、Node、Session Map、Session Queue、Event Bus

    Router - 监听新会话请求

    Distributor - 选择合适的 Node 执行测试

    Node - 在对应主机执行测试

    Session Map - 给 Node 节点标记 session ID

    Session Queue - 维护所有的会话队列

    Event Bus - 作为 Grid 各组件通讯桥梁

    图片

    特性三:不同的 Gird 运行模式

    在 Selenium Grid 3 及之前版本中只能使用 Hub 和 Node 工作模式,Selenium Grid 4 除了提供对经典的 Hub 和 Node 模式支持之外,还引入了另外两种全新的模式 standalone、fully distributed。

    Standalone 模式

    standalone 模式能够在一台机器上面执行完整的分布式功能,是 Selenium Grid 的最简单的模式,默认情况下,服务会在 http://localhost:4444 地址监听,我们需要通过 RemoteWebDriver 指向这个地址。

    Classical 模式

    classical 模式也可以称为 hub 和 node 模式,此项模式比较适用于中小型分布式执行要求,根据需要设置一个服务节点(hub)和多个代理节点(node)。

    Fully Distributed 模式

    对于大型的分布式要求,可以采用完全分布式模式,这是 Selenium Grid 4 中最高级的模式,这种模式下需要自己启动每个组件。

    Standalone 模式使用

    在 standalone 模式下,Node 和 Hub 都是运行在相同的 Selenium Grid 服务中

    Step1:准备需要的环境

    因为后续下载的 Selenium 组件是 jar 文件,所以需要准备 Java 的环境去运行。如果没有安装 Java 的环境,可以进入到 https://www.oracle.com/java/technologies/downloads/下载安装 JDK 并且配置环境变量,配置完成之后进入到命令行终端,输入以下命令检测:

    java -version
    如果 Java 环境配置成功,你会看到相关的 Java 版本信息。

    Step2:下载浏览器驱动

    下一步需要根据你当前的操作系统以及浏览器选择下载合适的驱动。

    Chrome Driver 地址:https://npm.taobao.org/mirrors/chromedriver

    Firefox Driver 地址:https://npm.taobao.org/mirrors/geckodriver

    驱动下载完成后放置到某个目录下,并将目录添加到系统的环境变量中。在 Selenium Grid 服务启动时将会自动识别。如果不做此操作 Selenium Grid 将无法在在这些浏览器上执行测试。

    图片

    Step3:创建 Selenium Grid

    这一步我们需要下载 Selenium Server 对应地址:https://www.selenium.dev/downloads/

    下载完毕之后将其放置到任意的目录中,接下来在命令行终端运行以下命令启动 Selenium Grid

    java -jar selenium-server-4.1.1.jar standalone

     你将会看到下面的信息输出,我们可以看到 Chrome 以及 Firefox 都被注册到了 Grid 中

    1. D:\Selenium Grid>java -jar selenium-server-4.1.1.jar standalone
    2. 16:59:31.406 INFO [LogManager$RootLogger.log] - Using the system default encoding
    3. 16:59:31.409 INFO [OpenTelemetryTracer.createTracer] - Using OpenTelemetry for tracing
    4. 16:59:37.876 INFO [NodeOptions.getSessionFactories] - Detected 8 available processors
    5. 16:59:38.046 INFO [NodeOptions.discoverDrivers] - Discovered 2 driver(s)
    6. 16:59:38.071 INFO [NodeOptions.report] - Adding Firefox for {"browserName": "firefox"} 8 times
    7. 16:59:38.072 INFO [NodeOptions.report] - Adding Chrome for {"browserName": "chrome"} 8 times

    我们可以通过访问 http://localhost:4444/status 看到当前的状态

    1. {
    2. "value": {
    3. "ready": true,
    4. "message": "Selenium Grid ready.",
    5. "nodes": [
    6. {
    7. "id": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    8. "uri": "http:\u002f\u002f192.168.56.1:4444",
    9. "maxSessions": 8,
    10. "osInfo": {
    11. "arch": "amd64",
    12. "name": "Windows 10",
    13. "version": "10.0"
    14. },
    15. "heartbeatPeriod": 60000,
    16. "availability": "UP",
    17. "version": "4.1.1 (revision e8fcc2cecf)",
    18. "slots": [
    19. {
    20. "id": {
    21. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    22. "id": "b8a3c42e-c8fb-493c-bb3c-7b6deaa2a02a"
    23. },
    24. "lastStarted": "1970-01-01T00:00:00Z",
    25. "session": null,
    26. "stereotype": {
    27. "browserName": "firefox",
    28. "platformName": "WIN10"
    29. }
    30. },
    31. {
    32. "id": {
    33. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    34. "id": "0eaffe11-62a1-4593-a94f-80151a69c24b"
    35. },
    36. "lastStarted": "1970-01-01T00:00:00Z",
    37. "session": null,
    38. "stereotype": {
    39. "browserName": "chrome",
    40. "platformName": "WIN10"
    41. }
    42. },
    43. {
    44. "id": {
    45. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    46. "id": "7c7211bf-58a7-4ddb-9246-effecbf910ce"
    47. },
    48. "lastStarted": "1970-01-01T00:00:00Z",
    49. "session": null,
    50. "stereotype": {
    51. "browserName": "firefox",
    52. "platformName": "WIN10"
    53. }
    54. },
    55. {
    56. "id": {
    57. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    58. "id": "437be3d5-bdf0-44aa-b401-51f7b9136b15"
    59. },
    60. "lastStarted": "1970-01-01T00:00:00Z",
    61. "session": null,
    62. "stereotype": {
    63. "browserName": "chrome",
    64. "platformName": "WIN10"
    65. }
    66. },
    67. {
    68. "id": {
    69. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    70. "id": "f799da78-4ac8-4799-8d4b-50314a954c01"
    71. },
    72. "lastStarted": "1970-01-01T00:00:00Z",
    73. "session": null,
    74. "stereotype": {
    75. "browserName": "chrome",
    76. "platformName": "WIN10"
    77. }
    78. },
    79. {
    80. "id": {
    81. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    82. "id": "10bd31b1-acf6-4006-af7c-47ea448a6a33"
    83. },
    84. "lastStarted": "1970-01-01T00:00:00Z",
    85. "session": null,
    86. "stereotype": {
    87. "browserName": "chrome",
    88. "platformName": "WIN10"
    89. }
    90. },
    91. {
    92. "id": {
    93. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    94. "id": "31c91763-4aef-4379-910c-647266806fce"
    95. },
    96. "lastStarted": "1970-01-01T00:00:00Z",
    97. "session": null,
    98. "stereotype": {
    99. "browserName": "chrome",
    100. "platformName": "WIN10"
    101. }
    102. },
    103. {
    104. "id": {
    105. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    106. "id": "20caece4-cb26-4914-8dfa-80fffd37191f"
    107. },
    108. "lastStarted": "1970-01-01T00:00:00Z",
    109. "session": null,
    110. "stereotype": {
    111. "browserName": "firefox",
    112. "platformName": "WIN10"
    113. }
    114. },
    115. {
    116. "id": {
    117. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    118. "id": "53a12fa7-63a4-474d-bab4-5e6fc6976ff1"
    119. },
    120. "lastStarted": "1970-01-01T00:00:00Z",
    121. "session": null,
    122. "stereotype": {
    123. "browserName": "chrome",
    124. "platformName": "WIN10"
    125. }
    126. },
    127. {
    128. "id": {
    129. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    130. "id": "7d1bb113-1050-482f-bd5d-939362270fdf"
    131. },
    132. "lastStarted": "1970-01-01T00:00:00Z",
    133. "session": null,
    134. "stereotype": {
    135. "browserName": "firefox",
    136. "platformName": "WIN10"
    137. }
    138. },
    139. {
    140. "id": {
    141. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    142. "id": "c4993662-f2f1-46e6-ab6c-6eae7727dd68"
    143. },
    144. "lastStarted": "1970-01-01T00:00:00Z",
    145. "session": null,
    146. "stereotype": {
    147. "browserName": "firefox",
    148. "platformName": "WIN10"
    149. }
    150. },
    151. {
    152. "id": {
    153. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    154. "id": "d9fcf1d0-cba0-4a53-bba4-934f35be8ccb"
    155. },
    156. "lastStarted": "1970-01-01T00:00:00Z",
    157. "session": null,
    158. "stereotype": {
    159. "browserName": "chrome",
    160. "platformName": "WIN10"
    161. }
    162. },
    163. {
    164. "id": {
    165. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    166. "id": "8b8bdd06-4c6f-4344-812a-3429b5d013c7"
    167. },
    168. "lastStarted": "1970-01-01T00:00:00Z",
    169. "session": null,
    170. "stereotype": {
    171. "browserName": "firefox",
    172. "platformName": "WIN10"
    173. }
    174. },
    175. {
    176. "id": {
    177. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    178. "id": "f7ca236a-7c1f-48ba-93e1-25745ed18493"
    179. },
    180. "lastStarted": "1970-01-01T00:00:00Z",
    181. "session": null,
    182. "stereotype": {
    183. "browserName": "chrome",
    184. "platformName": "WIN10"
    185. }
    186. },
    187. {
    188. "id": {
    189. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    190. "id": "3116789e-3fab-4bcc-89fe-9c0b788bb29f"
    191. },
    192. "lastStarted": "1970-01-01T00:00:00Z",
    193. "session": null,
    194. "stereotype": {
    195. "browserName": "firefox",
    196. "platformName": "WIN10"
    197. }
    198. },
    199. {
    200. "id": {
    201. "hostId": "4bb7d6f7-466d-4537-87ca-1441023e0fff",
    202. "id": "3abf1ce7-cd89-48ae-a33d-252abd9a29c5"
    203. },
    204. "lastStarted": "1970-01-01T00:00:00Z",
    205. "session": null,
    206. "stereotype": {
    207. "browserName": "firefox",
    208. "platformName": "WIN10"
    209. }
    210. }
    211. ]
    212. }
    213. ]
    214. }
    215. }

     我们还可以可以通过在浏览器端输入 http://localhost:4444/grid/console 来查看 Grid 控制台,也可以看到 standalone 模式下,在 node 节点中有对应的 Chrome 浏览器和 Firefox 浏览器。

    图片

    Step4:使用 Selenium Grid 执行测试

    在上述步骤中,我们通过最简单的 standalone 模式配置好了 hub 以及 node,下一步我们将会执行我们的自动化测试。

    在编写测试脚本时,我们只需要通过 RemoteWebDriver 指向 http://localhost:4444/

    1. @Test
    2. public void testChrome() throws MalformedURLException {
    3. DesiredCapabilities caps = new DesiredCapabilities();
    4. caps.setCapability(CapabilityType.BROWSER_NAME,"chrome");
    5. WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/"), caps);
    6. driver.manage().window().maximize();
    7. driver.get("http://testingpai.com/");
    8. }
    9. @Test
    10. public void testFirefox() throws MalformedURLException {
    11. DesiredCapabilities caps = new DesiredCapabilities();
    12. caps.setCapability(CapabilityType.BROWSER_NAME,"firefox");
    13. WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/"), caps);
    14. driver.manage().window().maximize();
    15. driver.get("http://testingpai.com/");
    16. }

     上述示例客户端脚本和 Grid 服务都是在本机,当然在实际应用中我们可以将 Grid 服务和脚本分别部署在两台主机上,此时脚本中指向的地址:http://localhost:4444/换成 Grid 服务所在主机的对外 IP 地址即可。

    最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

    在这里插入图片描述

    这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!   

  • 相关阅读:
    [Vue3 博物馆管理系统] 使用Vue3、Element-plus tabs组件构建选项卡功能
    ceisum初始化
    Linux和window查找对应程序或进程,并杀死进程方法
    Linux服务器安装并远程使用 Jupyter Notebook
    ConcurrentHashMap深入剖析(基于JDK1.7)
    【CLR C#】面向面试的.Net的GC(垃圾回收)机制及其整体流程
    据采集的三种方式-如何获取数据
    聚苯乙烯-二乙烯基苯-甲基丙烯酸缩水甘油酯(PS-GMA)微球/聚吡咯复合微球的性能
    1.代码审计大致规则
    j2ee 自定义MVC(上)
  • 原文地址:https://blog.csdn.net/qq_48811377/article/details/133702115