ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

零基础7小时掌握AI自动化测试:Python+Playwright实战指南

零基础7小时掌握AI自动化测试:Python+Playwright实战指南 很多同学在准备测试开发岗位时都会纠结一个问题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推荐或 SeleniumAI 能力接入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(headlessFalse) page browser.new_page() page.goto(https://www.example.com) print(page.title()) browser.close()解释一下这段代码做了什么事sync_playwright()是同步入口负责启动浏览器进程管理。p.chromium.launch(headlessFalse)启动 Chromium 浏览器headlessFalse表示有界面模式方便新手观察操作过程。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[nameusername]).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[nameusername]).fill(admin) page.locator(input[namepassword]).fill(123456) page.locator(button[typesubmit]).click() # 等待登录成功后的提示语出现 expect(page.locator(text登录成功)).to_be_visible(timeout5000)这里的timeout5000表示最多等待 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, modelgpt-3.5-turbo): 调用大模型 API 生成测试脚本 url https://api.openai.com/v1/chat/completions headers { Authorization: fBearer {api_key}, Content-Type: application/json } payload { model: model, messages: [ {role: system, content: 你是测试开发专家擅长生成 Playwright pytest 自动化测试脚本。}, {role: user, content: prompt} ] } response requests.post(url, headersheaders, jsonpayload) if response.status_code 200: return response.json()[choices][0][message][content] else: raise Exception(fAPI 调用失败{response.status_code} - {response.text}) def save_script(script, output_path): 保存生成的脚本到文件 os.makedirs(os.path.dirname(output_path), exist_okTrue) with open(output_path, w, encodingutf-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, threshold0.8): 通过图像模板匹配定位页面元素返回中心点坐标 # 页面截图 page.screenshot(pathscreenshots/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(headlessFalse) 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(timeout10000)实际项目中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-labelClose], .popup-close, ] def close_popups(page): 尝试关闭常见的非预期弹窗 for selector in COMMON_POPUP_SELECTORS: try: locator page.locator(selector) if locator.count() 0: locator.first.click(timeout1000) print(f已关闭弹窗元素{selector}) except Exception: pass def safe_click(page, selector, timeout5000): 安全点击先尝试关闭弹窗再点击目标元素 close_popups(page) page.locator(selector).click(timeouttimeout) 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, timeout10000): 等待页面网络请求完成、DOM 变化停止再执行后续操作 page.wait_for_load_state(networkidle, timeouttimeout) # 可选检查页面是否还在 loading try: loading page.locator(text加载中) expect(loading).to_be_hidden(timeouttimeout) 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(timeout800) 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_dirvideos/, traceon, ) 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(pathconfig/config.yaml): with open(path, r, encodingutf-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/ --maxfail1 --alluredirreports 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 生成一段自己的测试用例。如果在配置过程中遇到问题欢迎在评论区留言交流。
返回列表