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('百度一下,你就知道'); ```