使用 Playwright MCP 实现 UI 自动化测试 (1) - 知识铺
在传统的 UI 自动化测试中,测试人员需要编写大量脚本和选择器来模拟用户操作。然而,随着人工智能技术的快速发展,对话式自动化正在改变这一格局。Playwright 作为微软开源的现代化 Web 自动化工具,与 MCP(Model Context Protocol)协议的结合,为我们提供了一种全新的自动化测试体验。
这种组合允许我们通过自然语言指令来控制浏览器,大大降低了自动化测试的技术门槛,同时提高了脚本编写的效率。本文将全面介绍如何使用 Playwright 和 MCP 协议来构建智能化的 UI 自动化测试解决方案。
一、Playwright 与 MCP 协议概述
1.1 Playwright 的核心优势
Playwright 是一个强大的端到端测试框架,具有以下突出特点:
-
跨浏览器支持:原生支持 Chromium(Chrome/Edge)、Firefox 和 WebKit(Safari)三大浏览器引擎
-
智能等待机制:自动检测元素可交互状态,减少因网络延迟导致的测试失败
-
多语言支持:提供 JavaScript/TypeScript、Python、.NET 和 Java 等多种语言 API
-
移动端模拟:内置设备描述符,可真实模拟移动设备环境
-
录制功能:通过
playwright codegen
命令可录制操作并生成脚本
1.2 MCP 协议的作用
MCP(Model Context Protocol)定义了大型语言模型(LLM)与外部服务交互的规范。它的价值在于:
-
统一交互标准:让 LLM 能够与浏览器、数据库等外部工具无缝对话
-
动态流程控制:根据实时反馈调整指令,使自动化流程更加灵活
-
安全机制:权限分层设计,防止越权操作敏感资源
1.3 结合后的协同效应
当 Playwright 与 MCP 结合时,创建了对话式自动化的新范式:
-
自然语言驱动:用简单指令替代复杂脚本编写
-
实时交互调试:每一步操作都可即时验证和调整
-
降低技术门槛:非技术人员也能参与自动化流程创建
二、环境搭建与配置
2.1 安装 Playwright
以下是基于 Python 环境的 Playwright 安装步骤:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span><span leaf=""># 检查 Python 版本(需要 3.8+)</span></span><span leaf=""><br></span><span leaf="">python --version</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 安装 Playwright 库</span></span><span leaf=""><br></span><span leaf="">pip install playwright</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 安装浏览器驱动</span></span><span leaf=""><br></span><span leaf="">playwright install</span><span leaf=""><br></span></code>
对于国内用户,可以通过镜像加速下载:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span><span leaf="">set</span></span><span leaf=""> PLAYWRIGHT_DOWNLOAD_HOST=https://npmmirror.com/mirrors/playwright</span><span leaf=""><br></span><span leaf="">playwright install</span><span leaf=""><br></span></code>
2.2 验证安装
创建一个简单的测试脚本来验证环境:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span><span leaf="">from</span></span><span leaf=""> playwright.sync_api </span><span><span leaf="">import</span></span><span leaf=""> sync_playwright</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf="">with</span></span><span leaf=""> sync_playwright() </span><span><span leaf="">as</span></span><span leaf=""> p:</span><span leaf=""><br></span><span leaf=""> browser = p.chromium.launch(headless=</span><span><span leaf="">False</span></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""> page = browser.new_page()</span><span leaf=""><br></span><span leaf=""> page.goto(</span><span><span leaf="">"https://playwright.dev"</span></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""> print(</span><span><span leaf="">"页面标题:"</span></span><span leaf="">, page.title())</span><span leaf=""><br></span><span leaf=""> browser.close()</span><span leaf=""><br></span></code>
运行成功后,将看到浏览器自动打开并显示 Playwright 官网,控制台输出正确标题。
2.3 MCP 服务器部署
根据需求选择合适的 MCP Playwright 服务器。以下是几种常见方案:
方案一:使用官方 MCP 服务器
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span><span leaf=""># 使用 NPX 直接运行</span></span><span leaf=""><br></span><span leaf="">npx @playwright/mcp@latest</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 或全局安装后启动</span></span><span leaf=""><br></span><span leaf="">npm install -g @playwright/mcp</span><span leaf=""><br></span><span leaf="">npx @playwright/mcp@latest</span><span leaf=""><br></span></code>
方案二:使用社区增强版服务器
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span><span leaf=""># 克隆仓库</span></span><span leaf=""><br></span><span leaf="">git </span><span><span leaf="">clone</span></span><span leaf=""> https://github.com/your-username/mcp-playwright.git</span><span leaf=""><br></span><span><span leaf="">cd</span></span><span leaf=""> mcp-playwright</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 使用 uv 安装依赖(推荐)</span></span><span leaf=""><br></span><span leaf="">uv sync</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 或使用 pip</span></span><span leaf=""><br></span><span leaf="">pip install -e .</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 安装 Playwright 浏览器</span></span><span leaf=""><br></span><span leaf="">uv run playwright install</span><span leaf=""><br></span></code>
方案三:专用功能服务器
对于特定需求(如仅需网页内容抓取),可使用专用服务器:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">npm install @kevinwatt/playwright-fetch-mcp</span><span leaf=""><br></span></code>
2.4 客户端配置
以 VSCode 为例,配置 MCP 服务器连接:
在 VSCode 设置(settings.json)中加入:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"mcpServers"</span></span><span leaf="">: {</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"playwright"</span></span><span leaf="">: {</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"command"</span></span><span leaf="">: </span><span><span leaf="">"npx"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"args"</span></span><span leaf="">: [</span><span><span leaf="">"@playwright/mcp@latest"</span></span><span leaf="">],</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"timeout"</span></span><span leaf="">: </span><span><span leaf="">300</span></span><span leaf=""><br></span><span leaf=""> }</span><span leaf=""><br></span><span leaf=""> }</span><span leaf=""><br></span><span leaf="">}</span><span leaf=""><br></span></code>
对于 Claude Desktop 用户,配置方式类似:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"mcpServers"</span></span><span leaf="">: {</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"playwright-fetch"</span></span><span leaf="">: {</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"command"</span></span><span leaf="">: </span><span><span leaf="">"npx"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"args"</span></span><span leaf="">: [</span><span><span leaf="">"-y"</span></span><span leaf="">, </span><span><span leaf="">"@kevinwatt/playwright-fetch-mcp"</span></span><span leaf="">],</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"enabled"</span></span><span leaf="">: </span><span><span leaf="">true</span></span><span leaf=""><br></span><span leaf=""> }</span><span leaf=""><br></span><span leaf=""> }</span><span leaf=""><br></span><span leaf="">}</span><span leaf=""><br></span></code>
三、MCP Server 的核心功能与工具集
不同的 MCP Playwright 服务器提供各具特色的功能集。以下是常见工具的分类介绍:
3.1 浏览器控制工具
-
create_browser_session:创建新的浏览器会话,可指定浏览器类型、视口大小等参数
-
close_browser_session:关闭当前浏览器会话,释放资源
-
navigate_to_url:导航到指定 URL
3.2 页面交互工具
-
click_element:点击页面元素,支持多种定位策略
-
fill_input:在输入框中填写文本
-
wait_for_selector:等待元素出现或达到特定状态
-
double_click_element:双击元素
-
select_option:选择下拉选项
3.3 数据提取工具
-
get_text_content:获取元素文本内容
-
get_element_attribute:获取元素属性值
-
get_page_title:获取页面标题
-
get_page_url:获取当前页面 URL
-
fetch_json:直接获取 JSON 数据(特定服务器支持)
-
fetch_txt:获取网页纯文本内容
-
fetch_markdown:获取转换为 Markdown 格式的网页内容
3.4 高级功能工具
-
take_screenshot:截取页面截图,支持全页截图
-
execute_javascript:执行 JavaScript 代码并返回结果
-
generate_test_cases:从需求描述自动生成测试用例
表:主要 MCP Playwright 服务器功能对比
功能 | 官方 MCP | mcp-playwright | playwright-fetch | mcp-playwright-test |
---|---|---|---|---|
浏览器控制 |
|
✓
|
✓
|
✓
|
✓
| |
页面交互
|
✓
|
✓
|
✗
|
✓
| |
数据提取
|
基础
|
全面
|
专业抓取
|
全面
| |
测试生成
|
✗
|
✗
|
✗
|
✓
| |
报告生成
|
✗
|
✗
|
✗
|
✓
|
四、实战案例:完整的 UI 自动化流程
下面通过一个实际案例演示如何使用 Playwright 与 MCP 完成 UI 自动化测试。
4.1 测试场景描述
假设我们需要自动化测试一个网站的登录流程:
-
打开网站登录页面
-
输入用户名和密码
-
点击登录按钮
-
验证登录成功
-
执行登出操作
4.2 传统 Playwright 脚本实现
首先,我们看看传统的实现方式:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span><span leaf="">from</span></span><span leaf=""> playwright.sync_api </span><span><span leaf="">import</span></span><span leaf=""> sync_playwright</span><span leaf=""><br></span><span leaf=""><br></span><span><span><span leaf="">def</span></span><span leaf=""> </span><span><span leaf="">test_login</span></span><span><span leaf="">()</span></span><span leaf="">:</span></span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">with</span></span><span leaf=""> sync_playwright() </span><span><span leaf="">as</span></span><span leaf=""> p:</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf=""># 启动浏览器</span></span><span leaf=""><br></span><span leaf=""> browser = p.chromium.launch(headless=</span><span><span leaf="">False</span></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""> page = browser.new_page()</span><span leaf=""><br></span><span leaf=""> </span><span leaf=""><br></span><span leaf=""> </span><span><span leaf=""># 导航到登录页面</span></span><span leaf=""><br></span><span leaf=""> page.goto(</span><span><span leaf="">"https://example.com/login"</span></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""> </span><span leaf=""><br></span><span leaf=""> </span><span><span leaf=""># 输入凭据</span></span><span leaf=""><br></span><span leaf=""> page.fill(</span><span><span leaf="">"#username"</span></span><span leaf="">, </span><span><span leaf="">"testuser"</span></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""> page.fill(</span><span><span leaf="">"#password"</span></span><span leaf="">, </span><span><span leaf="">"testpass"</span></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""> </span><span leaf=""><br></span><span leaf=""> </span><span><span leaf=""># 点击登录按钮</span></span><span leaf=""><br></span><span leaf=""> page.click(</span><span><span leaf="">"#login-btn"</span></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""> </span><span leaf=""><br></span><span leaf=""> </span><span><span leaf=""># 等待导航完成并验证登录成功</span></span><span leaf=""><br></span><span leaf=""> page.wait_for_selector(</span><span><span leaf="">".dashboard"</span></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">assert</span></span><span><span leaf="">"Dashboard"</span></span><span><span leaf="">in</span></span><span leaf=""> page.title()</span><span leaf=""><br></span><span leaf=""> </span><span leaf=""><br></span><span leaf=""> </span><span><span leaf=""># 执行登出</span></span><span leaf=""><br></span><span leaf=""> page.click(</span><span><span leaf="">"#logout-btn"</span></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""> page.wait_for_selector(</span><span><span leaf="">".login-form"</span></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""> </span><span leaf=""><br></span><span leaf=""> browser.close()</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf="">if</span></span><span leaf=""> __name__ == </span><span><span leaf="">"__main__"</span></span><span leaf="">:</span><span leaf=""><br></span><span leaf=""> test_login()</span><span leaf=""><br></span></code>
4.3 MCP 对话式自动化实现
通过 MCP 服务器,我们可以使用自然语言指令完成相同任务:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span><span leaf="">"打开 https://example.com/login,在用户名字段输入 testuser,在密码字段输入 testpass,点击登录按钮,等待 dashboard 元素出现,验证页面标题包含 Dashboard,最后点击退出按钮并确认返回登录页面"</span></span><span leaf=""><br></span></code>
MCP 服务器会将上述指令转换为相应的 Playwright API 调用,执行流程如下:
-
创建会话:
create_browser_session(browser_type="chromium", headless=False)
-
页面导航:
navigate_to_url("https://example.com/login")
-
元素操作:
-
fill_input(selector="#username", text="testuser")
-
fill_input(selector="#password", text="testpass")
-
click_element(selector="#login-btn")
- 等待与验证:
-
wait_for_selector(selector=".dashboard", state="visible")
-
get_page_title()
并验证包含 “Dashboard”
- 退出操作:
-
click_element(selector="#logout-btn")
-
wait_for_selector(selector=".login-form", state="visible")
4.4 高级功能:自动化测试报告
对于更复杂的测试需求,可以使用 mcp-playwright-test 等服务器,它们提供测试报告生成功能:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span><span leaf=""># 使用专业测试服务器生成详细报告</span></span><span leaf=""><br></span><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"mcpServers"</span></span><span leaf="">: {</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"mcp-playwright-test"</span></span><span leaf="">: {</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"command"</span></span><span leaf="">: </span><span><span leaf="">"npx"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"args"</span></span><span leaf="">: [</span><span><span leaf="">"-y"</span></span><span leaf="">, </span><span><span leaf="">"mcp-playwright-test"</span></span><span leaf="">],</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"env"</span></span><span leaf="">: {</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"BROWSER_TYPE"</span></span><span leaf="">: </span><span><span leaf="">"chromium"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"BROWSER_HEADLESS"</span></span><span leaf="">: true,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"TEST_STORAGE_DIR"</span></span><span leaf="">: </span><span><span leaf="">"./test-results"</span></span><span leaf=""><br></span><span leaf=""> }</span><span leaf=""><br></span><span leaf=""> }</span><span leaf=""><br></span><span leaf=""> }</span><span leaf=""><br></span><span leaf="">}</span><span leaf=""><br></span></code>
执行测试后,系统会生成包含以下内容的详细报告:
-
测试用例执行结果(通过/失败)
-
错误截图和堆栈跟踪
-
网络请求日志
-
性能指标数据
五、最佳实践与优化策略
5.1 元素定位策略
可靠的元素定位是自动化测试成功的关键。以下是推荐的定位器使用优先级:
-
语义化定位器(首选):
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span><span leaf=""># 使用角色定位</span></span><span leaf=""><br></span><span leaf="">role=button:登录</span><span leaf=""><br></span><span><span leaf=""># 使用文本定位</span></span><span leaf=""><br></span><span leaf="">text=提交</span><span leaf=""><br></span></code>
-
CSS 选择器(次选):
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">button.submit</span><span leaf=""><br></span><span leaf="">input[name=</span><span><span leaf="">'username'</span></span><span leaf="">]</span><span leaf=""><br></span></code>
-
复合定位器(复杂场景):
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span><span leaf=""># 组合条件定位</span></span><span leaf=""><br></span><span leaf="">role=cell:配置项&locator=button&first=true</span><span leaf=""><br></span><span><span leaf=""># 文本过滤</span></span><span leaf=""><br></span><span leaf="">div&has_text=重要</span><span leaf=""><br></span></code>
表:元素定位策略对比
定位策略 | 示例 | 优点 | 适用场景 |
---|---|---|---|
角色定位 |
| role=button:登录
|
可读性强,稳定性高
|
有语义化标签的元素
| |
文本定位
| text=提交
|
直观易懂
|
有明确文本内容的元素
| |
CSS 选择器
| button.submit
|
灵活高效
|
样式稳定的元素
| |
复合定位
| div&has_text=重要&first=true
|
精准定位
|
复杂页面结构
|
5.2 等待机制优化
避免使用固定的 sleep
等待,而是利用 Playwright 的智能等待机制:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span><span leaf=""># 不推荐:固定等待</span></span><span leaf=""><br></span><span><span leaf="">import</span></span><span leaf=""> time</span><span leaf=""><br></span><span leaf="">time.sleep(</span><span><span leaf="">5</span></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 推荐:智能等待</span></span><span leaf=""><br></span><span><span leaf="">await</span></span><span leaf=""> wait_for_selector(selector=</span><span><span leaf="">".loading"</span></span><span leaf="">, state=</span><span><span leaf="">"hidden"</span></span><span leaf="">)</span><span leaf=""><br></span><span><span leaf="">await</span></span><span leaf=""> wait_for_selector(selector=</span><span><span leaf="">".content"</span></span><span leaf="">, state=</span><span><span leaf="">"visible"</span></span><span leaf="">)</span><span leaf=""><br></span></code>
5.3 错误处理与重试机制
实现健壮的自动化脚本需要完善的错误处理:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span><span leaf=""># 使用重试机制提高稳定性</span></span><span leaf=""><br></span><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"retry_attempts"</span></span><span leaf="">: </span><span><span leaf="">3</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"retry_delay"</span></span><span leaf="">: </span><span><span leaf="">1000</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"fallback_actions"</span></span><span leaf="">: [</span><span leaf=""><br></span><span leaf=""> {</span><span><span leaf="">"action"</span></span><span leaf="">: </span><span><span leaf="">"refresh_page"</span></span><span leaf="">, </span><span><span leaf="">"when"</span></span><span leaf="">: </span><span><span leaf="">"element_not_found"</span></span><span leaf="">},</span><span leaf=""><br></span><span leaf=""> {</span><span><span leaf="">"action"</span></span><span leaf="">: </span><span><span leaf="">"alternative_selector"</span></span><span leaf="">, </span><span><span leaf="">"when"</span></span><span leaf="">: </span><span><span leaf="">"click_failed"</span></span><span leaf="">}</span><span leaf=""><br></span><span leaf=""> ]</span><span leaf=""><br></span><span leaf="">}</span><span leaf=""><br></span></code>
5.4 配置管理与环境隔离
使用配置文件管理不同环境的参数:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"environments"</span></span><span leaf="">: {</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"development"</span></span><span leaf="">: {</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"base_url"</span></span><span leaf="">: </span><span><span leaf="">"http://localhost:3000"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"credentials"</span></span><span leaf="">: </span><span><span leaf="">"dev_creds"</span></span><span leaf=""><br></span><span leaf=""> },</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"staging"</span></span><span leaf="">: {</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"base_url"</span></span><span leaf="">: </span><span><span leaf="">"https://staging.example.com"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"credentials"</span></span><span leaf="">: </span><span><span leaf="">"stage_creds"</span></span><span leaf=""><br></span><span leaf=""> },</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"production"</span></span><span leaf="">: {</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"base_url"</span></span><span leaf="">: </span><span><span leaf="">"https://example.com"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"credentials"</span></span><span leaf="">: </span><span><span leaf="">"prod_creds"</span></span><span leaf=""><br></span><span leaf=""> }</span><span leaf=""><br></span><span leaf=""> }</span><span leaf=""><br></span><span leaf="">}</span><span leaf=""><br></span></code>
六、常见问题与解决方案
6.1 浏览器启动失败
问题:执行时浏览器无法启动或立即崩溃。
解决方案:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span><span leaf=""># 确保已正确安装浏览器</span></span><span leaf=""><br></span><span leaf="">playwright install</span><span leaf=""><br></span><span><span leaf=""># 检查权限问题(Linux/Mac)</span></span><span leaf=""><br></span><span leaf="">sudo playwright install</span><span leaf=""><br></span><span><span leaf=""># 强制重新安装</span></span><span leaf=""><br></span><span leaf="">playwright install --force</span><span leaf=""><br></span></code>
6.2 元素定位失败
问题:脚本无法找到指定元素,导致测试中断。
解决方案:
-
使用录制功能生成可靠选择器:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">playwright codegen https://example.com</span><span leaf=""><br></span></code>
-
启用追踪功能调试定位问题:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">context.tracing.start(screenshots=</span><span><span leaf="">True</span></span><span leaf="">, snapshots=</span><span><span leaf="">True</span></span><span leaf="">)</span><span leaf=""><br></span><span><span leaf=""># 执行操作...</span></span><span leaf=""><br></span><span leaf="">context.tracing.stop(path=</span><span><span leaf="">"trace.zip"</span></span><span leaf="">)</span><span leaf=""><br></span></code>
6.3 异步操作处理
问题:动态加载内容导致操作提前执行。
解决方案:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span><span leaf=""># 等待网络空闲</span></span><span leaf=""><br></span><span leaf="">page.wait_for_load_state(</span><span><span leaf="">"networkidle"</span></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 等待特定元素出现</span></span><span leaf=""><br></span><span><span leaf="">await</span></span><span leaf=""> wait_for_selector(selector=</span><span><span leaf="">".dynamic-content"</span></span><span leaf="">, state=</span><span><span leaf="">"attached"</span></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 设置合理超时时间</span></span><span leaf=""><br></span><span leaf="">create_browser_session(default_timeout=</span><span><span leaf="">30000</span></span><span leaf="">)</span><span leaf=""><br></span></code>
6.4 MCP 连接问题
问题:MCP 服务器无法启动或连接超时。
解决方案:
-
检查命令路径是否正确
-
增加超时时间设置:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">{</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"timeout"</span></span><span leaf="">: </span><span><span leaf="">500</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"env"</span></span><span leaf="">: {</span><span leaf=""><br></span><span leaf=""> </span><span><span leaf="">"NODE_OPTIONS"</span></span><span leaf="">: </span><span><span leaf="">"--max-old-space-size=4096"</span></span><span leaf=""><br></span><span leaf=""> }</span><span leaf=""><br></span><span leaf="">}</span><span leaf=""><br></span></code>
-
查看日志诊断问题:
<span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/qbvaL9taELv3wlwFaaOic9sknbbFzQjLnSGNKTg6iaCpQpVicwIzOzAS0Bj0CHiciaI4e8GoRddMzoltd48R4eobL2mengZuLkXZY/640?wx_fmt=svg&from=appmsg" data-fail="0"></span><code><span leaf="">npx @playwright/mcp@latest --verbose</span><span leaf=""><br></span></code>
七、未来展望与应用扩展
Playwright 与 MCP 的结合为 UI 自动化测试带来了革命性的变化,未来有几个值得关注的发展方向:
7.1 智能化测试生成
利用 AI 能力自动生成测试用例和脚本:
-
需求描述转测试:将自然语言需求自动转换为可执行的测试用例
-
智能修复:自动检测并修复失败的测试脚本
-
异常预测:基于历史数据预测可能出现的异常情况
7.2 跨平台扩展
将自动化能力扩展到更多平台:
-
移动端自动化:真机移动设备测试自动化
-
桌面应用:Electron、Flutter 等桌面应用测试
-
API 测试集成:UI 与 API 测试的无缝结合
7.3 协作与集成增强
提升团队协作效率的功能:
-
可视化报告:更直观的测试结果展示和分析
-
团队知识库:共享测试用例和最佳实践
-
CI/CD 深度集成:与 GitHub Actions、Jenkins 等工具更紧密集成
结语
Playwright 与 MCP 的结合标志着 UI 自动化测试进入了新时代。通过本文的介绍,我们看到了如何利用这一强大组合,以更直观、高效的方式实现复杂的自动化测试任务。
无论是经验丰富的测试工程师,还是刚入门的新手,这种对话式自动化方法都能显著提升工作效率。随着技术的不断成熟,我们可以期待更多创新功能的出现,进一步降低自动化测试的门槛,让团队能够更专注于创造高质量的产品。
现在就开始尝试使用 Playwright 和 MCP 协议,体验下一代 UI 自动化测试的便捷与强大吧!
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/ai/post/202510/%E4%BD%BF%E7%94%A8-Playwright-MCP-%E5%AE%9E%E7%8E%B0-UI-%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95-1/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com