news 2026/6/9 16:57:35

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/6/4 17:46:33

25、PsExec工具使用全解析

PsExec工具使用全解析 1. 程序路径与执行基础规则 当使用PsExec命令行时,如果“program”部分仅指定文件名,该文件必须存在于远程系统的Path环境变量中。需要注意的是,对全局PATH环境变量所做的更改通常要在系统重启后,服务才能识别到。 若“program”参数指定的是绝对路…

作者头像 李华
网站建设 2026/6/4 22:55:21

30、进程与诊断实用工具使用指南

进程与诊断实用工具使用指南 1. VMMap 文本查找与复制 在 VMMap 的详细视图中查找特定文本,可按 Ctrl+F 组合键。查找功能会选中详细视图中包含你指定文本的下一个可见行,文本可位于任意列。需注意,它不会在未展开的子块中搜索文本。若要重复上一次搜索,按 F3 键即可…

作者头像 李华
网站建设 2026/6/4 23:26:08

外包干了6天,技术明显退步。。。

我是一名大专生,自20年通过校招进入湖南某软件公司以来,便扎根于功能测试岗位,一晃便是近5年的光阴。今年9月,我如梦初醒,意识到长时间待在舒适的环境中,已让我变得不思进取,技术停滞不前。更令…

作者头像 李华
网站建设 2026/6/7 13:51:35

MOSFET驱动电路PCB设计注意事项

MOSFET驱动电路PCB设计:那些你踩过的坑,其实都藏在走线里你有没有遇到过这样的情况?明明选了低导通电阻、小栅极电荷的MOSFET,驱动IC也是主流型号,原理图看起来无懈可击。结果一上电,示波器一测——栅极波形…

作者头像 李华
网站建设 2026/6/5 0:41:23

React与SharePoint:如何正确使用Graph API访问文件

在现代Web开发中,React作为前端框架的佼佼者,经常与Microsoft的Graph API结合使用来管理和访问各种云服务,包括SharePoint。通过Graph API,我们可以访问SharePoint的文件和文件夹,但如果不正确配置请求,可能会遇到一些问题。本文将详细介绍如何使用Graph API在React项目中…

作者头像 李华