Browser automation using Playwright API directly. Navigate websites, interact with elements, extract data, take screenshots, generate PDFs, record videos, and automate complex workflows. More reliable than MCP approach.
直接使用 Playwright API 实现可靠的浏览器自动化,无需 MCP 的复杂性。
bash
javascript
const { chromium } = require(playwright);
(async () => {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
await page.goto(https://example.com);
await page.screenshot({ path: screenshot.png });
await browser.close();
})();
javascript
// ✅ 正确:使用自动等待和重试
await page.getByRole(button, { name: 提交 }).click();
await page.getByLabel(用户名).fill(user);
await page.getByPlaceholder(搜索).fill(query);
// ❌ 错误:如果元素未就绪可能失败
await page.click(#submit);
javascript
// ✅ 正确:对 DOM 变化具有弹性
await page.getByRole(heading, { name: 欢迎 });
await page.getByText(登录);
await page.getByTestId(login-button);
// ❌ 错误:脆弱的 CSS 选择器
await page.click(.btn-primary > div:nth-child(2));
javascript
// 等待网络空闲
await page.goto(https://spa-app.com, { waitUntil: networkidle });
// 等待特定元素
await page.waitForSelector(.results-loaded);
await page.waitForFunction(() => document.querySelectorAll(.item).length > 0);
javascript
// 每个上下文 = 隔离的会话(cookies、存储)
const context = await browser.newContext();
const page = await context.newPage();
// 在同一上下文中的多个页面
const page2 = await context.newPage();
javascript
// 模拟 API 响应
await page.route(/api/users, route => {
route.fulfill({
status: 200,
body: JSON.stringify({ users: [] })
});
});
// 阻止资源
await page.route(/*.{png,jpg,css}, route => route.abort());
javascript
// 填写表单
await page.goto(https://example.com/login);
await page.getByLabel(用户名).fill(myuser);
await page.getByLabel(密码).fill(mypass);
await page.getByRole(button, { name: 登录 }).click();
// 等待导航/结果
await page.waitForURL(/dashboard);
await expect(page.getByText(欢迎)).toBeVisible();
javascript
// 提取表格数据
const rows = await page.$$eval(table tr, rows =>
rows.map(row => ({
name: row.querySelector(td:nth-child(1))?.textContent,
price: row.querySelector(td:nth-child(2))?.textContent
}))
);
// 使用 JavaScript 评估提取
const data = await page.evaluate(() => {
return Array.from(document.querySelectorAll(.product)).map(p => ({
title: p.querySelector(.title)?.textContent,
price: p.querySelector(.price)?.textContent
}));
});
javascript
// 全页截图
await page.screenshot({ path: full.png, fullPage: true });
// 元素截图
await page.locator(.chart).screenshot({ path: chart.png });
// PDF(仅 Chromium)
await page.pdf({
path: page.pdf,
format: A4,
printBackground: true
});
javascript
const context = await browser.newContext({
recordVideo: {
dir: ./videos/,
size: { width: 1920, height: 1080 }
}
});
const page = await context.newPage();
// ... 执行操作 ...
await context.close(); // 视频自动保存
javascript
const context = await browser.newContext({
viewport: { width: 375, height: 667 },
userAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 14_0),
isMobile: true,
hasTouch: true
});
javascript
// 方法 1:HTTP 基本认证
const context = await browser.newContext({
httpCredentials: { username: user, password: pass }
});
// 方法 2:Cookies
await context.addCookies([
{ name: session, value: abc123, domain: .example.com, path: / }
]);
// 方法 3:本地存储
await page.evaluate(() => {
localStorage.setItem(token, xyz);
});
// 方法 4:重用认证状态
await context.storageState({ path: auth.json });
// 后续:await browser.newContext({ storageState: auth.json });
javascript
// 上传
await page.setInputFiles(input[type=file], /path/to/file.pdf);
// 下载
const [download] = await Promise.all([
page.waitForEvent(download),
page.click(a[download])
]);
await download.saveAs(/path/to/save/ + download.suggestedFilename());
javascript
page.on(dialog, dialog => {
if (dialog.type() === alert) dialog.accept();
if (dialog.type() === confirm) dialog.accept();
if (dialog.type() === prompt) dialog.accept(我的回答);
});
javascript
// 按名称获取框架
const frame = page.frame(frame-name);
await frame.click(button);
// 按定位器获取框架
const frame = page.frameLocator(iframe).first();
await frame.getByRole(button).click();
// Shadow DOM
await page.locator(my-component).locator(button).click();
javascript
await context.tracing.start({ screenshots: true, snapshots: true });
// ... 运行测试 ...
await context.tracing.stop({ path: trace.zip });
// 在 https://trace.playwright.dev 查看
javascript
const browser = await chromium.launch({
headless: true, // 无界面运行
slowMo: 50, // 减慢 50ms(用于调试)
devtools: false, // 打开开发者工具
args: [--no-sandbox, --disable-setuid-sandbox] // Docker/Ubuntu
});
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
locale: ru-RU,
timezoneId: Europe/Moscow,
geolocation: { latitude: 55.7558, longitude: 37.6173 },
permissions: [geolocation],
userAgent: 自定义代理,
bypassCSP: true, // 绕过内容安全策略
});
javascript
// 带超时的重试
try {
await page.getByRole(button, { name: 加载 }).click({ timeout: 10000 });
} catch (e) {
console.log(未找到按钮或按钮不可点击);
}
// 检查元素是否存在
const hasButton = await page.getByRole(button).count() > 0;
// 使用自定义条件等待
await page.waitForFunction(() =>
document.querySelectorAll(.loaded).length >= 10
);
用于 Playwright 浏览器安装:
bash
该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 manikantasai-playwright-automation-1776335303 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 manikantasai-playwright-automation-1776335303 技能
skillhub install manikantasai-playwright-automation-1776335303
文件大小: 5.1 KB | 发布时间: 2026-4-17 15:11