当前位置: 首页 > article >正文

【Web自动化】探索Selenium与WebDriver的核心原理

一、认识 Selenium

Selenium 是web 应用中基于UI的自动化测试框架,支持多平台、多浏览器、多语言, 可以模拟人工对浏览器进行操作。
早期的selenium RC已经被现在的webDriver所替代,可以简单的理解 selenium1.0+webdriver构成现在的Selenium2.0。

Selenium 作为 Web 自动化测试工具的优点:

1. 开源免费

2. 支持多浏览器:  如 Chrome,  Edge,  Firefox ......

3. 支持多系统: 如 Linux , Windows, MaxOS .......

4. 支持多种开发语言:  Python,  Java, CSharp, Ruby,  JavaScript.....

5. selenium 提供了很多供测试使用的 API

这边建议使用  Python 作为 selenium 工具包的开发语言, 因为, Python 作为解释性语言, 是逐行进行翻译执行的, 也就是说, 我们可以针对某一行代码, 某一个方法, 可以在控制台, 进行反复的赋值调试,  直到符合代码我们的预期, 是非常适合网页的定位, 获取数据啥的这样的操作.  而类似于 Java 这样编译型语言, 通常是需要全部文件进行编译后才能执行, 并不支持, 针对某一行, 或某一个模块进行反复调试,  每一次错误, 都是重新断点调试, 大大影响了自动化程序的开发效率.


1.1 Selenium 简介

现在我们说起selenium,一般指的是Selenium2.0。它有由Selenium IDE,Webdriver,Selenium Grid组成。

1.1.1 Selenium IDE

  • 概述:Selenium IDE一个用于Selenium 测试的完成集成开发环境,主要用于记录和回放测试。它适合快速创建测试脚本,尤其适合不熟悉编程的用户。
  • 功能
    • 录制和回放:用户可以通过录制操作来生成测试脚本,然后随时回放。
    • 脚本编辑:支持简单的脚本编辑功能,可以手动调整录制的测试。
    • 导出脚本:可以将测试导出为多种编程语言(如Java、Python等)的代码,以便在更复杂的框架中使用。

1.2.2 Selenium WebDriver

  • 概述:WebDriver是Selenium的核心组件,提供了与浏览器的直接交互方式。它更强大且灵活,适合进行复杂的自动化测试。
  • 功能
    • 跨浏览器支持:支持多种浏览器(如Chrome、Firefox、Safari等)。
    • 支持多种语言:可以使用多种编程语言(如Java、Python、C#等)编写测试脚本。
    • 丰富的API:提供丰富的API,支持元素查找、事件触发、等待机制等功能。
    • 处理动态内容:能够处理AJAX和动态页面的内容。

1.2.3 Selenium Grid

  • 概述:Selenium Grid用于分布式测试,可以在不同的机器和浏览器上并行运行测试。
  • 功能
    • 并行执行:能够同时在多个浏览器和操作系统上运行测试,提高测试效率。
    • 集中管理:提供一个中心节点(Hub)来管理分布在不同机器上的节点(Node),简化测试环境的配置。
    • 扩展性:可以轻松添加或删除节点,以应对不同的测试需求。

总结: 

这三个组件结合使用,可以有效地提高自动化测试的效率和灵活性。Selenium IDE适合初学者和简单测试,WebDriver适合需要编程的复杂测试,而Grid则用于大规模的并行测试。


1.2  selenium , 浏览器驱动(Driver), 浏览器的关系

提到驱动, 你的脑海中是否想起了汽车驱动 - 发动机, 内燃机的灵魂之作, 也是汽车的核心, 决定了汽车是否能跑起来, 跑的有多快.

计算机驱动(Device Driver)是软件程序,它允许操作系统和硬件设备之间进行通信。驱动程序充当操作系统与硬件设备之间的桥梁,使得操作系统能够控制和使用各种硬件组件.

回到浏览器驱动这里, 如果我们是手动打开浏览器, 然后进行一系列操作, 那么这个驱动可以认为 是执行者的本身 - 人力.

对于自动化程序来讲, 如何让代码去代替人工操作浏览器呢?  这叫涉及到一个名词 "浏览器驱动", 顾名思义, 通过浏览器驱动就可以操作浏览器.

名词解释: 

浏览器驱动是指一种特定类型的软件 (由浏览器开发厂商提供相关版本支持服务),用于自动化和控制网页浏览器。它提供了接口,使得程序能够与浏览器进行交互,从而实现网页的自动化测试、爬虫或其他需要与浏览器交互的操作。


Selenium 编写的自动化脚本如何操作浏览器?

  1. 启动浏览器和绑定端口

    • 当你创建一个 WebDriver 实例(如 webdriver.Chrome())时,Selenium 会启动一个新的浏览器实例,并为其分配一个特定的端口。这个浏览器实例充当了一个远程服务器。
  2. 客户端与服务器的通信

    • 客户端:你的测试脚本充当客户端,它通过 CommandExecutor 将命令发送给 WebDriver 服务器。
    • HTTP 请求:使用 WebDriver Wire Protocol,客户端通过 HTTP 请求与服务器通信。请求的主体使用 JSON 格式,告诉webDriver (浏览器驱动)我们希望浏览器接下来做什么事情。
  3. WebDriver Wire Protocol

    • 这个协议定义了一组标准的 HTTP 请求和响应格式,使得不同的 WebDriver 实现(如 ChromeDriver、GeckoDriver 等)能够一致地处理命令和返回结果。
    • 请求包括各种操作,例如打开网页、查找元素、模拟点击等。请求格式通常包含方法(如 GET、POST)、路径和请求体。
  4. 服务器端的操作

    • 服务器端(即浏览器驱动)接收来自客户端的请求,并将其解析为浏览器的本地命令。每个驱动程序都需要实现具体的逻辑,将通用的 WebDriver 命令转换为对应浏览器的原生调用。
    • 例如,ChromeDriver 会使用 Chrome 浏览器的 DevTools 协议与浏览器进行通信。
  5. 返回结果

    • 执行完命令后,浏览器驱动会将结果(如页面状态、元素属性等)封装成 JSON 格式,通过 HTTP 响应返回给客户端。

1.3 webDriver 的工作原理:

WebDriver 的工作原理主要包括以下几个关键组件和步骤:

1. WebDriver 组件架构

WebDriver 由客户端和服务器端两部分组成:

  • 客户端:用户使用的编程语言的 WebDriver 实现(如 Java、Python、C# 等),用于编写测试脚本并与 WebDriver 服务器通信。
  • 服务器端:每种浏览器都有一个 WebDriver 实现,负责控制浏览器的行为(如 ChromeDriver、GeckoDriver 等)。

2. 工作流程

2.1 创建 WebDriver 实例

用户在代码中实例化一个 WebDriver 对象。

例如,在 Java 中创建 ChromeDriver 的实例:需要将 webDriver 设置为全局变量

WebDriver driver = new ChromeDriver();

例如,在 Python 中创建 ChromeDriver 的实例:将 webDriver 放到 python 编译环境目录下就可以不用写路径了.

# 创建 ChromeDriver 实例
driver = webdriver.Chrome(executable_path='path/to/chromedriver')  # 替换为你的 ChromeDriver 路径

2.2  启动浏览器和绑定端口

当我们创建一个 WebDriver 实例(如 webdriver.Chrome())时,Selenium 会启动一个新的浏览器实例,并为其分配一个特定的端口。这个浏览器实例充当了一个远程服务器。

2.3 发送命令

用户编写的脚本通过 WebDriver API 发送命令(如打开页面、查找元素、点击按钮等)。这些命令会被转化为 HTTP 请求,并发送到对应的浏览器驱动程序。

driver.get("https://www.baidu.com");

2.4 浏览器驱动处理请求

浏览器驱动程序接收这些请求,解析命令,然后通过与浏览器的通信接口(如 DevTools 协议)执行相应的操作。

2.5 执行操作

浏览器根据驱动程序的指令执行操作(如加载网页、查找元素、输入文本等)。

2.6  返回结果

执行完成后,浏览器驱动将操作的结果(如元素的状态、页面的 URL 等)返回给 WebDriver 客户端,用户可以在脚本中进一步处理这些结果。

2.7 元素查找

WebDriver 支持多种方式查找网页元素(如 ID、名称、类名、XPath、CSS 选择器等)。查找元素的请求同样会通过驱动发送给浏览器并返回结果。

2.8 等待机制

WebDriver 还提供了隐式等待和显式等待,以处理动态内容的加载。例如,显式等待可以让测试脚本在查找元素之前等待特定条件的发生,确保页面已完全加载。

2.8  支持的操作

WebDriver 允许用户进行多种操作,例如:

  • 点击、输入文本、拖放等用户交互。
  • 获取页面内容、元素属性等信息。
  • 执行 JavaScript 脚本。

总结

WebDriver 的设计理念是提供一个与浏览器交互的接口,能够模拟用户的操作。它通过客户端和浏览器驱动之间的通信,确保测试脚本能够高效、准确地控制浏览器,适应不同的测试需求。


1.4 环境部署

如果想要使用 selenium 包进行 web 自动化脚本开发, 需要一定的环境部署, 前置工作:

选择浏览器, 下载驱动, 导入selenium 工具包

详情操作见博客:  【WebDriver】浏览器驱动下载及其配置-CSDN博客


http://www.kler.cn/a/381080.html

相关文章:

  • MySQL 数据库优化详解【Java数据库调优】
  • OpenCV相机标定与3D重建(26)计算两个二维点集之间的部分仿射变换矩阵(2x3)函数 estimateAffinePartial2D()的使用
  • Opencv之对图片的处理和运算
  • UE5仿漫威争锋灵蝶冲刺技能
  • C++----类与对象(下篇)
  • 云原生服务网格Istio实战
  • Python OpenCV 图像改变
  • AI大模型赋能医学诊疗与药学服务——课题基金申请辅导项目成功举办
  • 安装Blender并使用
  • 【C++之STL】一文学会使用 string
  • 代码随想录之哈希表刷题总结
  • Redis学习:1. Redlock算法(MultiLock)和底层源码分析、2. Redis缓存过期淘汰策略
  • 【天线&运输】冲浪者检测系统源码&数据集全套:改进yolo11-DySnakeConv
  • C# 常用的测试框架合集
  • Oracle 第22章:数据仓库与OLAP
  • 【持续更新】【NLP项目】【自然语言处理】智能聊天机器人——“有问必答”【Chatbot】第1章、《系统、环境》
  • 论文解读:《Consensus-Aware Visual-Semantic Embedding for Image-Text Matching》
  • java.io.IOException: Too many open files
  • qt QPicture详解
  • Spring Boot助力信息学科平台系统构建
  • std::locale多语言切换
  • 在软件设计时,怎样寻找和确定对象,以及设计模式的作用
  • Java 8 中引入的 Comparator 工具方法
  • C++:unordered_set、unordered_map类
  • Spring Cloud数据库从MySQL切换到OceanBase
  • redis缓存雪崩、击穿、穿透