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/3 22:14:51

新手友好型AI平台:Anything-LLM安装配置图文教程

新手友好型AI平台:Anything-LLM安装配置图文教程 在当今信息爆炸的时代,我们每天都在与大量文档打交道——合同、报告、技术手册、学习资料……但真正能被“激活”的知识却少之又少。你是否曾为查找某个条款翻遍几十页PDF?是否希望大模型不仅…

作者头像 李华
网站建设 2026/4/26 21:21:33

降低AI使用门槛:Anything-LLM对非技术人员有多友好?

降低AI使用门槛:Anything-LLM对非技术人员有多友好? 在今天,几乎每个人都听说过“大模型”和“AI助手”。但如果你不是程序员、不懂机器学习、甚至对命令行都有点发怵——你真的能用上这些前沿技术吗?还是说,它们依然…

作者头像 李华
网站建设 2026/5/8 3:31:21

19、深入了解系统监控:Procmon 实用指南

深入了解系统监控:Procmon 实用指南 1. 过滤与高级输出 在系统监控中,Procmon 提供了多种过滤选项,以帮助用户聚焦于特定的系统活动。以下这些低级别操作通常会被默认过滤: - 名称以 IRP_MJ_ 开头的操作,这些是 Windows 驱动用于文件或设备 I/O、即插即用(PnP)、电…

作者头像 李华
网站建设 2026/5/11 17:55:57

20、进程监视器(Process Monitor)使用指南

进程监视器(Process Monitor)使用指南 1. 查看堆栈跟踪符号 若要查看堆栈跟踪中的符号,捕获跟踪的系统无需安装调试工具或配置符号,但查看跟踪的系统必须同时具备这两者。此外,该系统还必须能够访问跟踪系统的符号文件和二进制文件。对于 Windows 文件,Microsoft 公共符…

作者头像 李华
网站建设 2026/5/10 6:03:25

23、ProcDump 使用指南:异常监控与转储文件选项详解

ProcDump 使用指南:异常监控与转储文件选项详解 1. 异常监控 异常信息比 ProcDump 支持的其他标准相关信息丰富得多。当基于内存阈值进行过滤时,问题很简单:“是否超过阈值?”答案只有“是”或“否”。而异常包含的细节远不止“发生了异常”这么简单。 需要注意的是,将…

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

day30模块与包的导入

一、导入官方库 二、模块、包的定义 三、源代码的查看 如果第三方库是纯python写的,往往在函数上按住ctrl即可进入函数内部查看源代码。 但是很多第三方库为了性能,底层是用其他语言写的,这里我们计算机视觉库OpenCV为例。 OpenCV核心是用C…

作者头像 李华