很多同学在准备测试开发岗位时,都会纠结一个问题:AI 时代,自动化测试到底该怎么学?是继续死磕 Selenium,还是直接转向 AI 辅助测试?网上资料确实很多,但要么太零散,要么一上来就讲框架源码,对新手很不友好。本文整理了一套 7 小时快速入门 AI 自动化测试的闭环学习路径,面向零基础小白,全程干货,从环境搭建、核心语法到实战项目、AI 辅助排错一次性讲透。
1. AI 自动化测试到底是什么
1.1 从传统自动化测试说起
在聊 AI 自动化测试之前,我们得先明确传统自动化测试是什么。简单来说,自动化测试就是通过编写脚本或使用工具,让测试用例自动执行、自动比对结果、自动生成报告,从而替代人工重复点击和验证的过程。
传统自动化测试最常用的工具是 Selenium 和 Appium。Selenium 用于 Web 端 UI 自动化,Appium 用于移动端 APP 自动化。你写一段 Python 或 Java 代码,通过浏览器驱动去控制浏览器打开页面、点击按钮、输入文本、断言页面元素。
但传统自动化测试有几个长期存在的痛点:
- 元素定位不稳定:页面结构一改,XPath 或 CSS 选择器就失效。
- 脚本维护成本高:UI 频繁变更,测试脚本要跟着改。
- 无法应对动态内容:弹窗、异步加载、验证码等场景处理起来非常繁琐。
- 断言能力有限:很多测试只能判断元素是否存在,难以理解页面语义。
这些痛点,恰恰是 AI 自动化测试要解决的问题。
1.2 AI 自动化测试的定位
AI 自动化测试并不是要完全替代 Selenium 这类工具,而是把 AI 能力注入到测试设计、脚本生成、元素定位、结果分析、脚本维护等环节中,提升测试效率和稳定性。
常见的应用场景包括:
- AI 生成测试用例:根据需求描述自动生成覆盖正常、异常、边界场景的测试用例。
- AI 辅助元素定位:通过图像识别或语义理解定位元素,减少对 XPath 的依赖。
- 智能等待与自动修复:页面加载异常时自动调整等待策略,脚本失败时自动修复选择器。
- AI 生成自动化脚本:用自然语言描述操作步骤,AI 直接生成可运行的 Python 脚本。
- 测试结果智能分析:自动分类失败原因,区分是代码缺陷、环境问题还是脚本本身问题。
1.3 新手容易混淆的几个概念
学习 AI 自动化测试之前,建议先把这几个概念搞清楚:
| 概念 | 含义 | 与 AI 自动化测试的关系 |
|---|---|---|
| 自动化测试 | 用脚本代替手工执行测试用例 | 是 AI 自动化测试的基础能力 |
| AI 辅助测试 | 用大模型或机器学习能力辅助测试活动 | 是 AI 自动化测试的核心 |
| 测试开发 | 开发测试工具、平台、框架的岗位方向 | 自动化测试是测试开发的核心技能之一 |
| 大模型(LLM) | 能理解和生成自然语言或代码的模型 | 常用于自动生成用例、脚本、问题分析 |
需要提醒的是,AI 自动化测试目前还处于“辅助人”的阶段,不是输入一句需求就能得到完美测试脚本。更现实的工作方式是:人类设计测试策略,AI 辅助生成脚本和排查问题,最终由人审核确认。
2. 环境准备与版本说明
2.1 技术栈选型
当前适合新手快速上手的 AI 自动化测试技术栈组合是:
- 编程语言:Python 3.9 及以上
- 自动化测试框架:Playwright(推荐)或 Selenium
- AI 能力接入:OpenAI API、国内大模型 API,或本地 Ollama 部署
- 测试框架:pytest
- 断言库:pytest 自带断言即可
- 报告工具:Allure 或 pytest-html
选择 Python + Playwright 的原因有三个。
第一,Playwright 是微软开源的工具,相比 Selenium 更现代,自带了自动等待、多浏览器支持、网络拦截、移动端模拟等能力,能显著降低脚本稳定性问题。
第二,Playwright 的 Python API 设计非常简洁,代码量比 Selenium 少很多,适合新手快速看到成果。
第三,Playwright 与 AI 能力结合方便,录制脚本、生成代码、截图比对等功能可以直接与 AI 模型配合使用。
2.2 安装步骤
# 1. 创建虚拟环境(推荐) python -m venv ai_test_env # 2. 激活虚拟环境 # Windows: ai_test_env\Scripts\activate # macOS / Linux: source ai_test_env/bin/activate # 3. 安装 Playwright pip install playwright # 4. 安装 Playwright 浏览器 playwright install chromium # 5. 安装 pytest 和 pytest-playwright pip install pytest pytest-playwright # 6. 安装 requests(用于调用 AI API) pip install requests如果公司网络环境特殊,无法直接下载浏览器,可以配置国内镜像源后重试,或者手工下载浏览器放置到指定目录。版本需要根据你的项目实际情况调整,本文示例以常见环境为例,重点演示配置思路。
2.3 验证环境是否安装成功
安装完成后,在命令行执行:
python -c "from playwright.sync_api import sync_playwright; print('Playwright OK')"如果输出Playwright OK,说明环境基本可用。
3. Playwright 核心语法速成
3.1 启动浏览器并打开页面
Playwright 支持同步和异步两种 API 风格。对于新手来说,先掌握同步语法就够了。
# 文件:test_demo.py from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page() page.goto("https://www.example.com") print(page.title()) browser.close()解释一下这段代码做了什么事:
sync_playwright()是同步入口,负责启动浏览器进程管理。p.chromium.launch(headless=False)启动 Chromium 浏览器,headless=False表示有界面模式,方便新手观察操作过程。browser.new_page()创建新标签页。page.goto()打开指定 URL。page.title()获取页面标题。
3.2 元素定位与操作
Playwright 最核心的定位方式是page.locator(),它支持 CSS 选择器、XPath、文本内容等。而且 Playwright 自带自动等待机制,元素出现前会自动轮询等待,不需要像 Selenium 那样显式写time.sleep()。
# 定位按钮并点击 page.locator("button#login-btn").click() # 定位输入框并输入文本 page.locator("input[name='username']").fill("test_user") # 按文本内容定位 page.locator("text=立即登录").click() # 链式定位 page.locator("div.user-panel").locator("button.confirm").click()常用的操作包括:
click():点击元素fill():填写输入框select_option():选择下拉选项press():按键操作check()/uncheck():勾选复选框screenshot():元素截图
3.3 断言与等待
在 pytest 框架中,Playwright 的断言可以直接用 Python 的assert,但推荐使用 Playwright 提供的expect断言,因为它自带自动重试机制,能适应页面的异步加载。
from playwright.sync_api import expect def test_login(page): page.goto("https://example.com/login") page.locator("input[name='username']").fill("admin") page.locator("input[name='password']").fill("123456") page.locator("button[type='submit']").click() # 等待登录成功后的提示语出现 expect(page.locator("text=登录成功")).to_be_visible(timeout=5000)这里的timeout=5000表示最多等待 5 秒。如果 5 秒内元素出现,断言通过;否则断言失败。
3.4 监听弹窗事件
弹窗是 UI 自动化测试中最容易导致脚本失败的场景之一。Playwright 对弹窗的处理比 Selenium 简单很多,可以直接监听并自动处理。
def test_modal_handle(page): # 监听弹窗事件,自动接受 page.on("dialog", lambda dialog: dialog.accept()) page.goto("https://example.com/trigger-dialog") page.locator("button#show-dialog").click() # 弹窗会被自动接受,脚本不会被卡住 expect(page.locator("text=操作成功")).to_be_visible()对于非预期弹窗,比如广告弹窗、新手引导浮层、浏览器通知等,推荐使用“弹窗兜底处理”机制,后面第 5 节会专门讲。
4. AI 辅助自动化测试实战
4.1 用自然语言让 AI 生成自动化脚本
这是 AI 自动化测试最直观的用法。你可以把需求描述给大模型,让 AI 直接生成 Playwright 脚本。
一个有效的提示词模板如下:
你是测试开发专家。请根据以下需求生成 Playwright Python 自动化测试脚本,使用 pytest 框架。 测试场景: 1. 打开 https://example.com/login 2. 输入用户名 admin 3. 输入密码 123456 4. 点击登录按钮 5. 断言页面出现"登录成功"文本 6. 截图保存到 screenshots/login_success.png 要求: - 使用 sync_playwright API - 使用 expect 断言 - 添加合理注释 - 处理可能的弹窗AI 生成的脚本通常可以直接运行,但建议人工检查以下信息:
- 元素选择器是否合理
- 是否有必要添加显式等待
- 弹窗处理逻辑是否过宽
- 断言是否覆盖关键结果
4.2 编写一个 AI 测试脚本生成工具
下面我们可以做一个更接近实际工程的小工具:用 Python 调用大模型 API,自动把自然语言测试用例转换成 Playwright 脚本并保存到文件。
# 文件:ai_test_generator.py import requests import json import os def generate_test_script(api_key, prompt, model="gpt-3.5-turbo"): """调用大模型 API 生成测试脚本""" url = "https://api.openai.com/v1/chat/completions" headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } payload = { "model": model, "messages": [ {"role": "system", "content": "你是测试开发专家,擅长生成 Playwright + pytest 自动化测试脚本。"}, {"role": "user", "content": prompt} ] } response = requests.post(url, headers=headers, json=payload) if response.status_code == 200: return response.json()["choices"][0]["message"]["content"] else: raise Exception(f"API 调用失败:{response.status_code} - {response.text}") def save_script(script, output_path): """保存生成的脚本到文件""" os.makedirs(os.path.dirname(output_path), exist_ok=True) with open(output_path, "w", encoding="utf-8") as f: f.write(script) print(f"测试脚本已保存:{output_path}") if __name__ == "__main__": api_key = os.environ.get("OPENAI_API_KEY", "your-api-key") prompt = """ 请生成一个 Playwright 自动化测试脚本,测试电商网站购物车流程: 1. 打开首页 2. 点击第一个商品 3. 点击"加入购物车" 4. 点击"购物车"图标 5. 断言购物车中商品数量为1 """ script_content = generate_test_script(api_key, prompt) save_script(script_content, "generated_tests/test_add_to_cart.py")使用方式:
export OPENAI_API_KEY="你的API密钥" python ai_test_generator.py生成的脚本会保存到generated_tests/test_add_to_cart.py,然后用pytest执行。
如果你用的是国内大模型,比如通义千问、文心一言、智谱 GLM,只需要把url、model和请求格式换成对应平台的格式。
4.3 用 Playwright 录制脚本
Playwright 提供了代码录制功能,可以把你手动点击浏览器页面的过程录制并转换成 Python 脚本。这对于新手熟悉选择器语法非常有帮助。
playwright codegen https://example.com执行命令后,会弹出一个浏览器窗口和一个 Playwright Inspector 面板。你在浏览器中的每次点击、输入都会被实时记录,并生成代码。你可以选择生成 Python、Java、JavaScript 等不同语言的代码。
这个功能非常适合快速生成初版脚本,然后再结合 AI 调整优化。
4.4 基于图像识别的 AI 元素定位
当页面元素无法用常规选择器定位时,可以考虑图像识别方案。OpenCV 可以用来做模板匹配,找到目标元素在页面截图中的位置。
# 文件:image_locator.py import cv2 import numpy as np from playwright.sync_api import sync_playwright def find_element_by_image(page, template_path, threshold=0.8): """通过图像模板匹配定位页面元素,返回中心点坐标""" # 页面截图 page.screenshot(path="screenshots/page.png") screen_img = cv2.imread("screenshots/page.png") template_img = cv2.imread(template_path) # 模板匹配 result = cv2.matchTemplate(screen_img, template_img, cv2.TM_CCOEFF_NORMED) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) if max_val >= threshold: h, w = template_img.shape[:2] center_x = max_loc[0] + w // 2 center_y = max_loc[1] + h // 2 return center_x, center_y return None with sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page() page.goto("https://example.com") # 假设截图文件为 button.png point = find_element_by_image(page, "button.png") if point: x, y = point # 点击找到的坐标位置 page.mouse.click(x, y) print(f"已点击坐标:({x}, {y})") else: print("未找到目标元素") browser.close()需要注意,图像识别受分辨率、主题、缩放比例影响较大,生产环境不建议作为首选方案。它更适合作为常规选择器失效时的兜底方案。
4.5 智能等待策略
传统脚本失败最常见的原因是等待不足。Playwright 自带自动等待,但在一些特殊场景下,比如某个接口返回后才渲染页面数据,我们可以结合页面状态来做显式等待。
from playwright.sync_api import expect def test_wait_for_response(page): # 触发请求 page.goto("https://example.com/dashboard") # 等待某个接口响应成功 with page.expect_response("**/api/user/info") as response_info: page.locator("button#refresh").click() response = response_info.value assert response.status == 200 # 等待加载完成提示消失 expect(page.locator("text=加载中...")).to_be_hidden(timeout=10000)实际项目中,UI 自动化脚本最忌讳写死time.sleep(5),因为不同环境网络速度差异很大。推荐组合使用 Playwright 自动等待、expect轮询断言和接口响应等待。
5. 非预期弹窗导致自动化脚本失败的解决方案
5.1 问题复现
很多同学跑自动化脚本时遇到过这样的情况:脚本执行到一半突然失败,查看截图发现屏幕上多了个广告弹窗、抽奖弹窗或者用户协议弹窗,把目标元素挡住了,导致点击失败。
这类问题在电商网站、内容平台、海外站点特别常见。弹窗不是业务主流程的一部分,但确实会阻断自动化脚本执行。
常见报错包括:
Timeout 30000ms exceeded. locator.click: wait for visibleElement is not clickable at point (x, y)5.2 根本原因
弹窗出现时机不确定。它不是每次运行都会出现,可能首次访问出现,可能点击某个按钮后出现,也可能根据用户行为在固定时间弹出。这种不确定性导致自动化脚本无法预判。
5.3 解决方案一:事件监听兜底
Playwright 提供了page.on("dialog")监听 JavaScript 原生的 alert、confirm、prompt 弹窗。但要注意,这也只能处理系统弹窗,处理不了 DOM 弹窗。
对于 DOM 弹窗,我们可以加一层兜底逻辑:每次点击之前,尝试关闭常见弹窗元素。
# 文件:conftest.py from playwright.sync_api import sync_playwright import pytest COMMON_POPUP_SELECTORS = [ "text=关闭", "button.close", ".modal .close", "button[aria-label='Close']", ".popup-close", ] def close_popups(page): """尝试关闭常见的非预期弹窗""" for selector in COMMON_POPUP_SELECTORS: try: locator = page.locator(selector) if locator.count() > 0: locator.first.click(timeout=1000) print(f"已关闭弹窗元素:{selector}") except Exception: pass def safe_click(page, selector, timeout=5000): """安全点击:先尝试关闭弹窗,再点击目标元素""" close_popups(page) page.locator(selector).click(timeout=timeout) @pytest.fixture def handle_popups(): """pytest fixture,自动为每个测试添加弹窗兜底""" def _handle(page): page.on("dialog", lambda dialog: dialog.accept()) close_popups(page) return _handle使用方法:
def test_purchase(handle_popups, page): handle_popups(page) page.goto("https://example.com/product") risk_safe_click = lambda page, selector: (close_popups(page), page.locator(selector).click()) risk_safe_click(page, "button#buy-now") expect(page.locator("text=订单已提交")).to_be_visible()5.4 解决方案二:添加加载完成校验
更好的思路是:点击之前先判断页面是否处于稳定状态,而不是盲目等待固定时间。
def wait_for_page_stable(page, timeout=10000): """等待页面网络请求完成、DOM 变化停止,再执行后续操作""" page.wait_for_load_state("networkidle", timeout=timeout) # 可选:检查页面是否还在 loading try: loading = page.locator("text=加载中") expect(loading).to_be_hidden(timeout=timeout) except Exception: pass5.5 解决方案三:统一封装操作方法
在实际项目中,最推荐的做法是把“关闭弹窗 + 等待稳定 + 点击元素”封装成一个统一操作类,避免每个用例重写一遍。
# 文件:base_page.py from playwright.sync_api import Page class BasePage: def __init__(self, page: Page): self.page = page def close_common_popups(self): selectors = [ "text=知道了", "text=取消", "text=关闭", ".close-btn", ".modal-mask", ] for selector in selectors: locators = self.page.locator(selector) if locators.count() > 0: try: locators.first.click(timeout=800) except Exception: pass def click_with_popup_handling(self, selector): self.close_common_popups() self.page.locator(selector).click() def fill_with_popup_handling(self, selector, value): self.close_common_popups() self.page.locator(selector).fill(value)有了这个基类,测试用例只需要继承BasePage即可。维护成本会低很多。
6. 常见问题与排查思路
6.1 环境与安装问题
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
playwright命令找不到 | 虚拟环境未激活或安装失败 | 确认激活虚拟环境,执行pip list查看包是否安装 |
| 浏览器下载失败 | 网络问题或镜像权限问题 | 配置国内镜像,或手工下载浏览器 |
| pytest 无法发现测试用例 | 文件命名不以 test_ 开头 | 确认文件名以 test_ 开头,函数名以 test_ 开头 |
| API 调用不稳定 | 网络代理或 API 限额 | 检查环境变量代理配置,确认 API key 没有超额 |
6.2 脚本运行问题
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 元素定位超时 | 元素需要时间加载 | 增加expect轮询等待,避免time.sleep |
| 弹窗导致点击失败 | 非预期 DOM 弹窗 | 封装弹窗兜底处理逻辑 |
| 脚本在 CI 环境跑不通 | 无头模式与有头模式行为不同 | 录制时和调试时用有头模式,CI 用无头模式并增加失败截图 |
| 截图失败 | 页面未完全加载 | 先等待networkidle再截图 |
| AI 生成的脚本语法错误 | 提示词不够具体 | 要求 AI 输出完整可运行代码,并指定框架版本 |
6.3 排查顺序建议
遇到脚本失败,我建议按以下顺序排查:
- 查看失败截图(Playwright 会自动保存)。
- 查看页面 DOM 是否和预期一致。
- 检查是定位问题还是点击被拦截。
- 检查是否有非预期弹窗。
- 查看 Playwright 的 trace 文件,逐步回放操作过程。
Playwright 的 trace 功能非常强大,开启后可以记录整个测试过程的每一步截图、DOM 快照、网络请求和调试信息。
browser = p.chromium.launch() context = browser.new_context( record_video_dir="videos/", trace="on", ) page = context.new_page()7. 最佳实践与工程建议
7.1 从录制脚本到回归脚本的分层建设
新手刚接触 AI 自动化测试时,最忌讳一上来就想搭建一套完整平台。建议按阶段推进。
第一阶段(7 小时内完成):
- 掌握 Playwright 基础语法。
- 学会用 codegen 录制脚本。
- 会用 pytest 组织用例。
- 会用 AI 辅助生成脚本。
第二阶段(后续 1-2 周):
- 封装统一页面操作基类。
- 引入页面对象模型 POM。
- 接入数据驱动(Excel、JSON、YAML)。
- 配置 Allure 测试报告。
第三阶段(进阶):
- 搭建接口自动化测试框架。
- 自动化用例接入 CI/CD。
- 接入 AI 智能分析失败原因。
- 实现脚本自动修复。
7.2 代码组织规范
推荐的项目结构如下:
ai_test_project/ ├── pages/ # 页面对象模型 │ ├── __init__.py │ ├── base_page.py │ └── login_page.py ├── testcases/ # 测试用例 │ ├── __init__.py │ ├── test_login.py │ └── test_cart.py ├── config/ # 配置文件 │ ├── config.yaml │ └── test_data.json ├── utils/ # 工具类 │ ├── __init__.py │ ├── ai_generator.py │ └── popup_handler.py ├── reports/ # 测试报告 ├── screenshots/ # 失败截图 ├── conftest.py # pytest fixture ├── pytest.ini └── requirements.txt7.3 测试数据管理
测试数据不要硬编码在脚本里。推荐使用 YAML 或 JSON 配置文件隔离。环境变化时,只需要修改配置文件。
# 文件:config/config.yaml base_url: https://example.com users: admin: username: admin password: "123456" visitor: username: guest password: "guest123"读取方式:
import yaml def load_config(path="config/config.yaml"): with open(path, "r", encoding="utf-8") as f: return yaml.safe_load(f) config = load_config() user = config["users"]["admin"]7.4 AI 提示词工程建议
在 AI 自动化测试场景中,提示词质量直接影响生成脚本的质量。高效的提示词应包含以下要素:
- 技术栈信息(Python + Playwright + pytest)
- 测试需求描述(操作步骤)
- 断言要求(什么结果算通过)
- 输出格式要求(是否存在、是否截图)
- 约束条件(不要用 sleep、注意弹窗处理)
推荐模板:
请生成一个 Playwright Python 自动化测试脚本。 技术栈:Python 3.9 + Playwright + pytest。 测试场景:{在这里描述你的操作步骤}。 断言要求:{在这里描述通过条件}。 要求: 1. 使用 sync_playwright API。 2. 不要使用 time.sleep,使用 expect 自动等待。 3. 添加弹窗兜底处理。 4. 在截图失败时保存截图到 screenshots 目录。 5. 输出完整可运行代码,不要省略。7.5 安全与权限注意事项
在跑自动化测试时,尤其是涉及登录、支付、管理后台等场景,需要注意以下安全边界:
- 使用测试专用账号,不要使用真实生产账号。
- 涉及数据库变更的测试,建议在测试库或沙箱环境执行。
- 不要在生产环境随意执行全量回归脚本。
- 不要把 API 密钥、数据库密码直接写死在代码仓库中,建议使用环境变量或密钥管理工具。
- 避免在测试脚本里硬编码敏感个人信息。
7.6 持续集成接入建议
自动化测试的价值在于持续回归。当脚本写好之后,可以接入 Jenkins 或 GitLab CI,配置定时任务或代码提交触发执行。
# 示例:GitLab CI 的 .gitlab-ci.yml stages: - test ui-test: stage: test script: - python -m venv venv - source venv/bin/activate - pip install -r requirements.txt - playwright install chromium --with-deps - pytest testcases/ --maxfail=1 --alluredir=reports artifacts: paths: - reports/ - screenshots/ when: always需要强调的是,CI 环境是无头模式(headless),和本地调试的浏览器行为可能略有差异。首次接入 CI 时建议先用简单用例验证稳定性,再逐步增加用例。
8. 总结与学习路径建议
这篇文章把 AI 自动化测试从概念、环境搭建、Playwright 核心语法到 AI 辅助脚本生成、非预期弹窗处理完整讲了一遍。核心收获包括:
- 理解了 AI 自动化测试和传统自动化测试的关系。
- 搭建了 Python + Playwright + pytest 的最小可用环境。
- 掌握了 Playwright 元素定位、断言、等待、弹窗处理。
- 学会了用大模型 API 自动生成测试脚本。
- 掌握了非预期弹窗导致脚本失败的三种解决方案。
- 了解了项目结构规范、测试数据管理、CI 接入思路。
接下来的学习路径建议按顺序推进:
第一步,用 Playwright 录制一个真实网站的登录流程,改成 pytest 用例,跑通并在失败时截图。
第二步,把案例包装成页面对象模型,把测试数据抽离到 YAML。
第三步,接入一个免费或低成本的 AI 模型 API,尝试用自然语言生成用例,并校验生成质量。
第四步,搭建一个简单的自动化测试平台或 CI 流水线,让用例可以定时自动执行。
自动化测试是一项需要动手验证的技能,光看示例代码远远不够。建议你打开终端,按照本文第 2 节的步骤先把环境搭起来,然后运行第一个 Playwright 脚本,再尝试通过 AI 生成一段自己的测试用例。如果在配置过程中遇到问题,欢迎在评论区留言交流。