致力于用最直接明了的方式分享技术,本文持续更新中,喜欢的点个赞和收藏呗~
官方文档(安装): 官方文档
也可以按照以下步骤安装:


推荐安装官方插件

安装完成后目录如下, 并且点击运行按钮运行 case


npx playwright testnpx playwright test example.spec.ts (默认无头运行, 可以在 playwright.config.ts 配置文件中的 use 中增加 headless: false)
npx playwright test example.spec.ts example2.spec.ts --headednpx playwright test test.spec.ts --project=chromium// 截取元素
const searchBtn = page.locator('input[value="百度一下"]');
searchBtn.screenshot({ path: 'element.png' });
searchBtn.click();

await page.screenshot({ path: 'screenshot.png' });

await page.screenshot({ path: 'full.png', fullPage: true });

完整代码:
import { test, expect, chromium } from '@playwright/test';
test('test1', async () => {
const browser = await chromium.launch({ headless: false, slowMo: 150 });
const context = await browser.newContext({
recordVideo: {
dir: './recording',
},
});
const page = await context.newPage();
await page.goto('https://www.baidu.com/');
await expect(page).toHaveTitle(/百度一下/);
// 截图
await page.screenshot({ path: 'screenshot.png' });
await page.locator('#kw').fill('hello world');
// 截取元素
const searchBtn = page.locator('input[value="百度一下"]');
searchBtn.screenshot({ path: 'element.png' });
searchBtn.click();
await expect(page).toHaveTitle(/百度搜索/);
await page.waitForSelector('div[title="百度热搜"]');
await page.waitForTimeout(1000);
// 截图:全屏
await page.screenshot({ path: 'full.png', fullPage: true });
// clean
page.close();
context.close();
browser.close();
});
录制视频需要手动创建 context 并且指定视频的存放路径(记得清理 page, context, browser,注意清理顺序),然后再运行 npx playwright test test.spec.ts --project=chromium 。注意⚠️:如果是点击插件的运行时无法生成视频文件的,一定要命令行运行。

import { test, expect, chromium } from '@playwright/test';
test('test1', async () => {
const browser = await chromium.launch({ headless: false, slowMo: 100 });
const context = await browser.newContext({
recordVideo: {
dir: './recording',
},
});
const page = await context.newPage();
await page.goto('https://www.baidu.com/');
// Expect a title "to contain" a substring.
await expect(page).toHaveTitle(/百度一下/);
await page.locator('#kw').fill('hello world');
// Click the get started link.
await page.locator('input[value="百度一下"]').click();
await expect(page).toHaveTitle(/百度搜索/);
// clean
page.close();
context.close();
browser.close();
});
先来看下官方关于 Locators 的定义:
Locators are the central piece of Playwright’s auto-waiting and retry-ability. In a nutshell, locators represent a way to find element(s) on the page at any moment. Locator can be created with the
page.locator(selector[, options])method.
简而言之,Locators 是用来定位页面元素的,利用 page.locator(selector[, options]) 方法来实现定位。并且,Locators 自带自动等待和重试的属性。而且,Locators 总是能获取到最新的目标元素,例如于某些操作导致页面重新渲染而导致 DOM 元素发生改变,如下代码片段所示:
const locator = page.getByText('Submit');
// ...
await locator.hover();
await locator.click();
注意⚠️:我们一般需要对定位出来的元素进行操作,比如点击 click()。但是如果我们使用page.locator(selector[, options]) 方法定位出来的元素不唯一的时候,比如找到一组按钮,这会让程序不知道你要点击哪个,从而报错。如下图,当我们使用类名.title-content-title 进行定位后运行 click() 操作,会报错。而且官方也不建议我们使用 locator.first(), locator.last(), 和 locator.nth(index) 等方法,因为这些方法可能会随着页面的变化而变化,很可能与预期不符。更好的方法是用能够唯一定位到元素的方法 (最佳实践)。


Selectors 其实就是生成 Locators 的字符串( page.locator(selector[, options]) )。常见 Selectors 如下:
page.locator('#kw')page.locator('.s_ipt')page.locator('input[name="wd"]')
page.locator('text="Sign In"')page.locator('text=Sign In')page.locator('"Sign In"')
playwright.locator('button:below(:text("Forgot password"))')