自动化测试概念与 Web 自动化实战(基于 Selenium)

在软件测试领域,自动化测试是提升测试效率、保障回归测试质量的核心手段。尤其对于 C++ 开发的项目,自动化测试能有效减少重复手工操作,避免新增功能对历史功能的影响。本文从自动化基础概念入手,详解自动化分类、**Web 自动化测试核心工具(Selenium)**及实战流程。

一、自动化测试基础:从概念到核心认知

在学习具体技术前,我们首先要理清自动化测试的本质、目标及常见误区 ------ 这是避免后续实践走偏的关键。

1.1 什么是自动化测试?

自动化测试的核心是 "用程序代替人工完成操作",就像生活中的自动洒水机(通水后自动旋转洒水)、自动洗手液(感应出液)、超市自动闸门(无需手动开关),其本质都是通过预设逻辑减少人力消耗,同时提升效率和稳定性。

在软件测试中,自动化测试主要解决两大问题:

  • 回归测试效率低:软件迭代时,需反复验证历史功能是否正常(如 V2.0 版本不能影响 V1.0 的登录、支付功能),手工回归耗时且易出错,自动化可一键执行用例。
  • 人力成本高:重复的 "打开页面→输入数据→点击按钮→验证结果" 操作,可通过脚本自动完成,让测试人员聚焦更复杂的探索性测试。

1.2 自动化测试的核心误区(面试高频考点)

很多初学者对自动化测试存在认知偏差,这些误区也是笔试 / 面试的高频考点,必须明确:

误区 1:自动化测试能完全取代人工测试?

答案:不能

自动化测试的脚本由人工编写,若后续功能变更(如界面按钮位置调整、接口参数修改),脚本需同步维护;且自动化无法完成 "主观判断类" 测试(如界面美观度、操作流畅性),自动化测试不一定比人工测试更能保障系统的可靠性,这些仍需人工评估。自动化是人工测试的补充,而非替代

误区 2:自动化测试能大幅度降低工作量?

答案:错误

自动化测试存在 "初始投入成本"(编写脚本、搭建环境),仅在 "长期重复执行" 场景下(如回归测试)才能体现价值;若测试用例仅执行 1-2 次,手工测试反而更高效。而且测试工作不仅仅包含执行测试阶段,测试主要由人工测试,通过自动化辅助测试。笔试中遇到 "大幅度降低工作量""完全取代" 等绝对化表述,需谨慎选择(通常为错误选项),可以说"一定程度上"。

1.3 自动化测试的核心目标:回归测试

自动化测试的主要应用场景是回归测试,即:

  • 软件迭代多个版本 时,对历史功能进行整体验证(如 V3.0 上线前,需验证 V1.0-V2.0 的所有核心功能)。
  • 新增功能上线后,验证其是否影响已有功能(如新增 "会员体系" 后,可能出现代码的增删改查,有可能对历史功能产生影响,需确认普通用户的 "登录、下单" 功能正常)。
  • 新版本即将上线,意味着有用户使用新版本,也有用户使用旧版本。如果不对旧版本测试,可能会出现新版本上线后,旧版本无法使用或者旧版本出现功能故障,所以都要测试。

其他测试场景(如探索性测试、新功能测试)仍以人工为主,自动化仅作为辅助。

二、自动化测试分类:别再混淆不同类型的自动化

自动化测试是 "统称",就像 "吃瓜" 包含吃西瓜、哈密瓜、香瓜,自动化也分为接口自动化、UI 自动化(Web / 移动端) 等类型。不同类型的自动化解决的问题、实施难度差异极大,需明确区分。

2.1 接口自动化测试:系统 "内部通信" 的验证

什么是接口自动化?

接口是系统内部模块间、或系统与外部服务间的 "通信协议"(如 C++ 后端与前端的 API 接口、支付系统与银行的对接接口)。接口自动化测试是通过脚本模拟接口调用,验证输入参数、输出结果、状态码是否符合预期,无需关注界面。

为什么要做接口自动化?

  • 更早发现问题:接口测试可在前端开发完成前执行(只需后端提供接口文档),提前暴露后端逻辑漏洞(如参数校验不严格、返回格式错误);
  • 稳定性高:接口不依赖界面,受环境影响小(如前端按钮位置变更不影响接口测试);
  • 效率高:一次可执行大量接口用例(如批量验证 100 个接口的正常 / 异常场景),远超手工测试效率。

实战场景(以校招网站为例)

打开浏览器 F12 的 Network 面板,访问 "校招信息列表" 页面时,前端会向后端发送接口请求(如kuxuezhang.com/index?page=1&size=16),接口自动化可模拟该请求,验证返回的 "校招信息列表" 是否完整、"未读数量" 是否正确。

2.2 前端自动化测试:用户 "看得见" 的界面验证

UI 自动化测试针对软件界面(如 Web 页面、手机 APP),模拟人工操作(点击按钮、输入文本、选择下拉框),验证界面展示和交互是否符合预期。主要分为Web 自动化移动端自动化两类。

2.2.1 移动端自动化测试

  • 定义:针对手机 APP 的界面测试,验证 APP 在不同手机型号、系统版本(如 Android 12、iOS 16)上的表现;
  • 实施方式:通常不直接在真实手机上测试,而是通过模拟器(如雷电模拟器、Android Studio 模拟器),在电脑上编写脚本操作模拟器中的 APP;
  • 核心挑战:稳定性差。受手机分辨率、系统版本、APP 弹窗(如广告、权限请求)影响大,脚本易失败(如按钮位置在小屏手机上偏移,导致点击失败)。

2.2.2 Web 自动化测试(重点)

  • 定义:针对 Web 页面(如百度、电商网站)的界面测试,模拟人工在浏览器上的操作(打开页面、输入关键词、点击搜索);
  • 核心价值:解决 Web 页面的回归测试问题(如百度首页的 "搜索""地图" 功能,每次迭代后需验证是否正常);
  • 实施工具:Selenium(最常用的 Web 自动化工具,支持 Chrome、Firefox 等浏览器,可结合 Python/C++ 编写脚本)。

Web 自动化实战场景(百度搜索)

手工百度搜索的步骤是 "打开 Chrome→访问https://www.baidu.com→输入'迪丽热巴'→点击'百度一下'",Web 自动化可通过脚本自动完成这一系列操作,并验证搜索结果中是否包含 "迪丽热巴" 相关内容。

2.3 自动化测试金字塔:哪种自动化性价比最高?

测试圈有个经典的理想化 "自动化测试金字塔" 模型:

手动/探索性测试:投入的人力、时间精力最多,但是获得的投资回报率最少。

UI 自动化测试:前端。测试人员编写UI自动化测试脚本。

API / 集成/组件测试:接口。测试人员编写接口自动化测试脚本。

单元测试:通常由开发人员编写单元测试脚本来执行单元测试。写完代码之后就执行,因为开发人员最熟悉自己写的代码,不需要额外的时间精力去熟悉代码。投入的人力、时间精力最少,但是获得的投资回报率最高。

前端看到的东西非常多,所有看到的每个元素都需要测试,而且所涉及到的不可靠因素太多了,编写前端自动化脚本相对于接口自动化测试脚本而言难度大、消耗成本大。

理想的自动化测试金字塔表达了自动化测试的理想情况,利用较少的时间和精力在单元测试上就能够发现更多有效的问题。

然后实际上在企业中,自动化往往是"冰淇淋蛋筒反模式":

在企业中,对应开发人员来说,相较于测试人员不是那么重视测试,所以,单元测试所用时间精力少。测试人员驱动开发人员来执行单元测试。UI 自动化测试和API / 集成/组件测试发现的问题也是有限的。

自动化需要大量的初始投资,找到"突破点",与手动测试相比,我们开始看到它对长期成本产生的积极影响,也能够清楚,这两种测试活动都是完全兼容,产生短期和长期利益。

核心结论:

  • 理想策略:优先做单元测试和 API 自动化,再做 UI 自动化。单元测试(如 C++ 的函数测试)能覆盖大部分代码逻辑,API 自动化稳定性高,两者性价比最高;
  • 企业现状:很多企业陷入 "冰淇淋蛋筒反模式"------ 过度投入 UI 自动化(占比 60% 以上),但因稳定性差、维护成本高,实际收益低。需避免这种误区。

三、Web 自动化测试实战:基于 Selenium+Python

人工:

自动化:

3.1 驱动

测试前提是需要打开浏览器,通过访问web服务器来对服务器界面进行一系列的操作。对于手工测试来说,这一系列的操作都需要测试人员手动的,一步一步的来执行测试。那么对于自动化程序来说,程序如何才能打开浏览器并执行我们预期的操作流程呢?

车有了驱动才能够让车跑起来,计算机有了驱动程序就可以与设备(耳机,摄像头,麦克风,键盘,显示器等等设备)进行通信。

程序想要打开web浏览器就需要安装web驱动(即WebDriver),WebDriver 以本地化方式驱动浏览

器。

3.2 安装web驱动

进入selenium官网后:

在目录上选择相应的,并且点击相关下载界面链接:

选择python版本:

找到要安装的浏览器版本链接,并点击:

点击下载:

选择自己使用的浏览器版本,并且进入下载:

注意选择和浏览器版本配套的驱动才可以,如果不匹配则无法开发浏览器。

所以每次浏览器更新,都需要重新下载新的版本,整个流程非常复杂!!!

3.3 驱动管理工具webdriver-manager

为解决 "版本不匹配" 问题,Selenium 提供了webdriver-manager工具,无需手动安装浏览器驱动,可自动下载并管理驱动(无需人工手动更新,浏览器更新不影响自动化的执行)。

环境搭建(Windows 系统)

步骤 1:安装 Python

确保 Python 已添加到系统环境变量(cmd 输入python --version能显示版本号)。

步骤 2:安装 webdriver-manager(自动管理驱动)

打开 cmd,执行命令:

bash 复制代码
pip install webdriver-manager

该工具会自动识别浏览器版本,下载对应的驱动,无需人工干预。

步骤 3:安装 Selenium(4.0.0 版本,统一版本避免兼容问题)

执行命令:

bash 复制代码
pip install selenium==4.0.0

出现successful,则安装完成。

安装完成后,在 Python 中输入import selenium无报错,说明安装成功。

以上适合电脑本身安装一个版本的情况,如果安装两个版本,操作如下:

webdriver-manager支持的python版本为:3.7~3.11

3.4 第一个 Web 自动化脚本:百度搜索

目标:通过脚本自动打开浏览器→访问百度首页→输入→点击 "百度一下"→关闭浏览器。

在python环境中:

选择相应的解释器,在新建的项目中,检查刚刚所安装的库:

新建文件:

脚本代码:

python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

#打开浏览器------驱动管理
#返回驱动路径,将其保存下来
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器对象
#路径传递后,做为Chrome参数,通过驱动打开浏览器
driver = webdriver.Chrome(service = Service(ChromeIns))

#输入百度网址
driver.get("https://www.baidu.com")

#输入关键词"迪丽热巴"
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("迪丽热巴")
#点击"百度一下"按钮
driver.find_element(By.CSS_SELECTOR,"#su").click()

#关闭浏览器
driver.quit()

由于程序很快只是闪现一下所以补充代码:

python 复制代码
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

#打开浏览器------驱动管理
#返回驱动路径,将其保存下来
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器对象
#路径传递后,做为Chrome参数,通过驱动打开浏览器
driver = webdriver.Chrome(service = Service(ChromeIns))

#网页停留一段时间
time.sleep(3)

#输入百度网址
driver.get("https://www.baidu.com")
time.sleep(3)

#输入关键词"迪丽热巴"
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("迪丽热巴")
time.sleep(3)

#点击"百度一下"按钮
driver.find_element(By.CSS_SELECTOR,"#su").click()
time.sleep(3)

#关闭浏览器
driver.quit()

但是我们发现一个问题,就是百度点开以后,只是发生了网页的打卡,并没有进行搜索,是因为:

1."#kw"百度的元素换了,要定位正确的元素。

定位元素

步骤如下:

进入百度界面

按F12,进入以下界面,点击所圈按钮:

利用鼠标,对所查找的id进行定位

找到后,复制元素即可。

2.现在百度的元素,输入了元素就会发生跳转了。不需要再次点击百度一下按钮了,所以"百度一下"按钮的点击可以删去。

修改后的代码如下:

python 复制代码
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

#打开浏览器------驱动管理
#返回驱动路径,将其保存下来
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器对象
#路径传递后,做为Chrome参数,通过驱动打开浏览器
driver = webdriver.Chrome(service = Service(ChromeIns))

#网页停留一段时间
time.sleep(3)

#输入百度网址
driver.get("https://www.baidu.com")
time.sleep(3)

#输入关键词"迪丽热巴"
driver.find_element(By.CSS_SELECTOR,"#chat-textarea").send_keys("迪丽热巴")
time.sleep(3)

#点击"百度一下"按钮
#driver.find_element(By.CSS_SELECTOR,"#chat-submit-button").click()
#time.sleep(3)

#关闭浏览器
driver.quit()

运行结果部分截图如下:

3.5 Selenium + 驱动 + 浏览器的工作流程(深入理解)

  1. 通过selenium编写的自动化脚本代码中在ChromeDriverService中创建一个服务。

  2. 向浏览器驱动程序发送HTTP请求浏览器驱动 程序解析请求,操控打开浏览器,并获得sessionid,如果再次对浏览器操作需携带此id。

3.执行 一系列的操作步骤,比如:输入文本进行查找。浏览器将返回的结果,再返回浏览器驱动,最后返回给自动化脚本。