2026/10/30 3:28:28

Playwright自动化测试:界面操作与实战技巧

Playwright自动化测试:界面操作与实战技巧 1. Playwright界面操作基础Playwright作为现代Web自动化测试框架其界面操作能力是其核心功能之一。与传统的Selenium等工具相比Playwright提供了更贴近真实用户行为的操作方式能够模拟各种鼠标和键盘事件。1.1 元素定位与基本操作在开始界面操作前我们首先需要定位到目标元素。Playwright支持多种定位方式// 通过文本定位 await page.click(text登录); // 通过CSS选择器定位 await page.click(#submit-button); // 通过XPath定位 await page.click(//button[namesubmit]);每种定位方式都有其适用场景文本定位适合快速定位可见文本元素CSS选择器适合精确控制样式元素XPath适合复杂层级结构的定位提示在实际项目中建议优先使用CSS选择器因为它的性能通常优于XPath且更易于维护。1.2 鼠标操作模拟Playwright提供了丰富的鼠标操作API可以模拟各种用户交互// 单击操作 await page.click(#button); // 双击操作 await page.dblclick(#button); // 右键点击 await page.click(#button, {button: right}); // 悬停操作 await page.hover(#menu); // 拖放操作 await page.dragAndDrop(#source, #target);这些操作都支持各种选项配置比如delay: 设置操作之间的延迟position: 指定点击的具体坐标modifiers: 设置修饰键(Shift/Ctrl/Alt等)1.3 键盘操作模拟键盘操作是界面自动化中不可或缺的部分// 输入文本 await page.fill(#input, Hello Playwright!); // 模拟按键 await page.press(#input, Enter); // 组合键操作 await page.keyboard.press(ControlA); await page.keyboard.press(ControlC);Playwright还支持更精细的键盘控制// 按下不放 await page.keyboard.down(Shift); // 释放按键 await page.keyboard.up(Shift);2. 对话框处理实战对话框是Web应用中常见的交互元素Playwright提供了专门的API来处理各种类型的对话框。2.1 常见对话框类型Playwright可以处理以下几种主要对话框类型alert对话框只有确定按钮的简单提示框confirm对话框有确定和取消按钮的选择框prompt对话框可以输入文本的输入框beforeunload对话框页面离开前的确认框2.2 对话框处理模式Playwright提供了两种处理对话框的方式1. 自动处理模式// 设置自动接受所有对话框 page.on(dialog, dialog dialog.accept()); // 触发对话框 await page.click(#show-dialog);2. 手动处理模式page.on(dialog, async dialog { console.log(对话框类型: ${dialog.type()}); console.log(对话框消息: ${dialog.message()}); if(dialog.type() confirm) { await dialog.accept(); } else { await dialog.dismiss(); } });2.3 对话框处理最佳实践在实际项目中处理对话框时需要注意等待对话框出现在触发对话框的操作后应该等待对话框确实出现处理超时情况设置合理的超时时间避免测试卡死验证对话框内容不仅处理对话框还要验证其显示内容是否正确test(测试确认对话框, async ({ page }) { let dialogMessage ; page.on(dialog, dialog { dialogMessage dialog.message(); dialog.accept(); }); await page.click(#show-confirm); // 验证对话框消息 expect(dialogMessage).toBe(确定要删除此项吗); });3. 多窗口与多标签页操作现代Web应用常常使用多窗口或多标签页Playwright提供了强大的多页面控制能力。3.1 获取页面引用当操作触发新窗口/标签页时可以通过以下方式获取新页面的引用// 等待新页面打开 const [newPage] await Promise.all([ page.waitForEvent(popup), page.click(#open-new-tab) ]); // 在新页面操作 await newPage.fill(#input, New tab content);3.2 多页面间切换Playwright可以轻松在多个页面间切换// 获取所有打开的页面 const pages context.pages(); // 切换到第二个页面 const secondPage pages[1]; await secondPage.bringToFront();3.3 多页面操作实战示例下面是一个完整的多页面操作示例test(测试多页面购物流程, async ({ browser }) { const context await browser.newContext(); const page await context.newPage(); // 打开主页面 await page.goto(https://shop.example.com); // 点击商品链接(会新开标签页) const [productPage] await Promise.all([ page.waitForEvent(popup), page.click(#product-123) ]); // 在商品页面加入购物车 await productPage.click(#add-to-cart); // 返回主页面 await page.bringToFront(); // 检查购物车数量 const cartCount await page.textContent(#cart-count); expect(cartCount).toBe(1); });4. 高级界面操作技巧4.1 文件上传处理Playwright处理文件上传非常简单// 单个文件上传 await page.setInputFiles(#file-input, path/to/file.pdf); // 多个文件上传 await page.setInputFiles(#multi-file-input, [ file1.pdf, file2.jpg ]); // 清除已选文件 await page.setInputFiles(#file-input, []);4.2 iframe操作处理iframe中的元素需要特别注意// 通过name属性定位iframe const frame page.frame(widget-frame); // 在iframe内操作 await frame.click(#iframe-button); // 通过元素句柄定位iframe const frameElement await page.$(.iframe-class); const frame await frameElement.contentFrame();4.3 页面滚动操作控制页面滚动位置// 滚动到元素 await page.locator(#footer).scrollIntoViewIfNeeded(); // 精确控制滚动位置 await page.evaluate(() { window.scrollTo(0, 500); }); // 平滑滚动 await page.mouse.wheel(0, 100);4.4 触摸事件模拟对于移动端测试可以模拟触摸事件// 获取元素坐标 const box await page.locator(#swipe-area).boundingBox(); // 模拟滑动操作 await page.touchscreen.tap(box.x 10, box.y 10); await page.touchscreen.swipe( box.x 10, box.y 10, box.x 200, box.y 10 );5. 实战经验与调试技巧5.1 常见问题排查元素定位失败使用page.pause()进入调试模式检查元素是否在iframe中确认元素是否被动态加载操作超时增加超时时间page.click(#btn, {timeout: 10000})检查页面是否完全加载确认没有等待对话框阻塞跨域问题使用--disable-web-security启动浏览器(仅测试环境)配置Playwright的跨域策略5.2 性能优化建议减少不必要的等待// 不好的做法 await page.waitForTimeout(5000); // 好的做法 await page.waitForSelector(#loaded-element, {state: visible});并行操作await Promise.all([ page.click(#btn1), page.click(#btn2) ]);重用浏览器上下文// 测试开始时 const context await browser.newContext(); // 测试之间 await context.clearCookies();5.3 调试技巧慢动作模式await page.click(#button, {slowMo: 500});录制操作视频const browser await chromium.launch({ headless: false, recordVideo: { dir: videos/ } });控制台输出page.on(console, msg console.log(页面日志:, msg.text()));6. 综合实战案例让我们通过一个完整的电商网站测试案例综合运用各种界面操作技术const { test, expect } require(playwright/test); test(电商网站完整测试流程, async ({ page }) { // 1. 访问首页 await page.goto(https://shop.example.com); // 2. 搜索商品 await page.fill(#search-input, Playwright书籍); await page.press(#search-input, Enter); // 3. 选择商品 await page.click(textPlaywright自动化测试实战); // 4. 处理可能的新标签页 const [productPage] await Promise.all([ page.waitForEvent(popup), page.click(#product-link) ]); // 5. 在商品页面操作 await productPage.selectOption(#quantity, 2); await productPage.click(#add-to-cart); // 6. 处理添加成功的提示框 productPage.on(dialog, dialog { expect(dialog.message()).toContain(已添加到购物车); dialog.accept(); }); // 7. 返回主页面查看购物车 await page.bringToFront(); await page.click(#view-cart); // 8. 验证购物车内容 const itemCount await page.textContent(.cart-item-count); expect(itemCount).toBe(2); // 9. 结算 await page.click(#checkout); // 10. 填写表单 await page.fill(#name, 测试用户); await page.fill(#address, 测试地址); // ...填写其他表单字段 // 11. 提交订单 await page.click(#submit-order); // 12. 验证订单成功 await expect(page.locator(.order-success)).toBeVisible(); });这个案例涵盖了基本页面导航表单操作多页面处理对话框处理元素定位与验证异步操作处理在实际项目中我们可以根据具体需求扩展这个测试流程添加更多的验证点和异常情况处理。