news 2026/5/12 6:20:55

playwright学习笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
playwright学习笔记

1. 安装 playwright

```bash # 默认安装所有浏览器驱动 # playwright浏览器安装在Windows系统的以下路径: # C:\Users\用户名\AppData\Local\ms-playwright npm install playwright ```

2. 编写第一个测试用例

```javascript const { test, expect } = require('@playwright/test'); test('第一个测试用例', async ({ page }) => { await page.goto('https://www.baidu.com'); await expect(page).toHaveTitle('百度一下,你就知道'); }); ```

3. 运行测试用例

```bash npx playwright test // 或者 # 测试文件位于e2e目录 # 在package.json中,test:e2e被映射为”playwright test“ # 实际执行: playwright test e2e/example.spec.ts npm run test:e2e ```

4. 断言

```javascript // 断言元素是否存在 await expect(page.locator('css=input[name="wd"]')).toBeVisible(); // 断言元素是否包含指定文本 await expect(page.locator('css=input[name="wd"]')).toContainText('百度一下'); ```

5. 元素操作

```javascript // 输入文本 await page.locator('css=input[name="wd"]').fill('Playwright'); // 点击元素 await page.locator('css=input[type="submit"]').click(); ```

6. 等待

```javascript // 等待元素可见 await page.locator('css=h1').waitFor({ state: 'visible' }); // 等待元素可点击 await page.locator('css=input[type="submit"]').waitFor({ state: 'enabled' }); ```

7. 处理弹窗

```javascript // 处理 alert 弹窗 await page.on('dialog', async dialog => { console.log(dialog.message()); await dialog.dismiss(); }); ```

8. 处理文件上传

```javascript // 上传文件 await page.locator('css=input[type="file"]').setInputFiles('path/to/file.txt'); ```

9. 处理 iframe

```javascript // 切换到 iframe await page.frameLocator('css=iframe[name="content"]').waitFor({ state: 'visible' }); // 在 iframe 中操作元素 await page.frameLocator('css=iframe[name="content"]').locator('css=input[name="wd"]').fill('Playwright'); ```

10. 处理多个浏览器窗口

```javascript // 打开新窗口 await page.locator('css=a[href="https://www.baidu.com"]').click({ target: 'blank' }); // 切换到新窗口 const newWindow = await page.waitForEvent('popup'); await newWindow.waitForLoadState(); // 断言新窗口标题 await expect(newWindow).toHaveTitle('百度一下,你就知道'); ```

11. 处理多个标签页

```javascript // 打开新标签页 await page.locator('css=a[href="https://www.baidu.com"]').click({ target: 'blank' }); // 切换到新标签页 const newPage = await page.waitForEvent('popup'); await newPage.waitForLoadState(); // 断言新标签页标题 await expect(newPage).toHaveTitle('百度一下,你就知道'); ```

12. 处理多个元素

```javascript // 断言多个元素是否存在 await expect(page.locator('css=input[name="wd"]')).toBeVisible(); // 断言多个元素是否包含指定文本 await expect(page.locator('css=input[name="wd"]')).toContainText('百度一下'); ```

13. 处理多个元素的断言

```javascript // 断言多个元素是否存在 await expect(page.locator('css=input[name="wd"]')).toBeVisible(); // 断言多个元素是否包含指定文本 await expect(page.locator('css=input[name="wd"]')).toContainText('百度一下'); ```

14. 处理多个元素的操作

```javascript // 输入文本 await page.locator('css=input[name="wd"]').fill('Playwright'); // 点击元素 await page.locator('css=input[type="submit"]').click(); ```

15. 处理多个元素的等待

```javascript // 等待多个元素可见 await page.locator('css=h1').waitFor({ state: 'visible' }); // 等待多个元素可点击 await page.locator('css=input[type="submit"]').waitFor({ state: 'enabled' }); ```

16. 处理多个元素的弹窗

```javascript // 处理 alert 弹窗 await page.on('dialog', async dialog => { console.log(dialog.message()); await dialog.dismiss(); }); ```

17. 处理多个元素的文件上传

```javascript // 上传文件 await page.locator('css=input[type="file"]').setInputFiles('path/to/file.txt'); ```

18. 处理多个元素的 iframe

```javascript // 切换到 iframe await page.frameLocator('css=iframe[name="content"]').waitFor({ state: 'visible' }); // 在 iframe 中操作元素 await page.frameLocator('css=iframe[name="content"]').locator('css=input[name="wd"]').fill('Playwright'); ```

19. 处理多个元素的多个浏览器窗口

```javascript // 打开新窗口 await page.locator('css=a[href="https://www.baidu.com"]').click({ target: 'blank' }); // 切换到新窗口 const newWindow = await page.waitForEvent('popup'); await newWindow.waitForLoadState(); // 断言新窗口标题 await expect(newWindow).toHaveTitle('百度一下,你就知道'); ```

20. 处理多个元素的多个标签页

```javascript // 打开新标签页 await page.locator('css=a[href="https://www.baidu.com"]').click({ target: 'blank' }); // 切换到新标签页 const newPage = await page.waitForEvent('popup'); await newPage.waitForLoadState(); // 断言新标签页标题 await expect(newPage).toHaveTitle('百度一下,你就知道'); ```
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 18:44:13

混合云部署模式下Anything-LLM的表现如何?

混合云部署模式下Anything-LLM的表现如何? 在企业加速拥抱AI的今天,一个现实问题日益凸显:我们既需要大语言模型强大的语义理解与生成能力,又无法容忍敏感数据离开内部网络。金融、医疗、政府等高合规性行业尤其如此——它们渴望智…

作者头像 李华
网站建设 2026/5/11 18:40:09

22、ProcDump 使用指南:进程监控与转储文件捕获

ProcDump 使用指南:进程监控与转储文件捕获 1. 选择要监控的进程 ProcDump 提供了多种方式来选择要监控的进程,具体如下: - 附加到现有进程:可以通过进程的镜像名称或 PID 将 ProcDump 附加到现有进程。若指定名称,该名称必须唯一标识一个进程;若指定的名称匹配多个进程…

作者头像 李华
网站建设 2026/5/2 14:49:07

36、Windows安全工具:AccessChk与Sysmon深度解析

Windows安全工具:AccessChk与Sysmon深度解析 在Windows系统的安全管理中,AccessChk和Sysmon是两款非常实用的工具。它们能帮助用户深入了解系统的安全设置和监控潜在的恶意活动。下面将详细介绍这两款工具的功能和使用方法。 AccessChk工具 AccessChk是一款用于检查系统对…

作者头像 李华
网站建设 2026/5/3 4:54:13

快速排序算法:c++

参考视频: 数据结构合集 - 快速排序(算法过程, 效率分析, 稳定性分析)_哔哩哔哩_bilibili 快速排序代码(C/C实现) 细到爆炸!_哔哩哔哩_bilibili 核心: 任取一个元素作为枢轴,比枢轴大的去左边,比枢轴小的去右边&am…

作者头像 李华
网站建设 2026/5/10 12:27:17

AI在工程调试中的能力边界_问题以及本质探讨

——从一次ROS2机器人系统调试经验谈起在使用AI辅助复杂系统调试(如ROS2机器人开发)时,许多人会发现一个反复出现的现象:提示词写得越长、细节越多,AI给出的方案看似越专业,却往往在关键环节失灵。问题不是…

作者头像 李华
网站建设 2026/5/9 18:30:39

Deepseek生成测试用例,分分钟的事啊!

在软件开发过程中,测试用例的设计和编写是确保软件质量的关键。 然而,软件系统的复杂性不断增加,手动编写测试用例的工作量变得异常庞大,且容易出错。 DeepSeek基于人工智能和机器学习,它能够依据软件的需求和设计文…

作者头像 李华