headless: true
节省资源,支持服务器端运行page.setRequestInterception(true)
)page.emulate()
支持iPhone、iPad等预设设备// 启动浏览器并导航至页面
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
// 模拟用户输入与点击
await page.type('#username', 'testuser');
await page.click('#submit-btn');
// 获取页面内容
const content = await page.evaluate(() => document.body.innerHTML);
// 生成PDF与截图
await page.pdf({ path: 'report.pdf' });
await page.screenshot({ path: 'screenshot.png' });
# 安装Puppeteer核心库
npm install puppeteer
# 安装Selenium WebDriver(JavaScript版)
npm install selenium-webdriver
# 下载浏览器驱动(以Chrome为例)
npm install chromedriver --save-dev
const { Builder, By } = require('selenium-webdriver');
async function createDriver(browserName) {
let driver;
switch (browserName.toLowerCase()) {
case 'chrome':
driver = await new Builder().forBrowser('chrome').build();
break;
case 'firefox':
driver = await new Builder().forBrowser('firefox').build();
break;
default:
throw new Error(`Unsupported browser: ${browserName}`);
}
return driver;
}
┌──────────────┐ ┌─────────────┐
│ Test Case │ │ Page Object│
└──────┬───────┘ └──────┬──────┘
│ │
▼ ▼
┌───────────────────┐ ┌─────────────────┐
│ Puppeteer (Chrome)│ │ Selenium (FF/Edge)│
│ - 动态渲染 │ │ - 兼容性验证 │
└───────────────────┘ └─────────────────┘
// Puppeteer启动Chrome并暴露端口
const browser = await puppeteer.launch({
headless: false,
args: ['--remote-debugging-port=9222']
});
// Selenium连接已启动的实例
const driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(new chrome.Options().debuggerAddress('localhost:9222'))
.build();
// Puppeteer处理动态登录
await page.type('#email', '[email protected]');
await page.type('#password', 'password123');
await Promise.all([
page.waitForResponse(res => res.url().includes('/api/login')),
page.click('#login-button')
]);
// Selenium验证跨浏览器Cookie
const driver = await createDriver('firefox');
await driver.get('https://example.com/dashboard');
const cookies = await driver.manage().getCookies();
console.assert(cookies.some(c => c.name === 'session_id'), '登录态丢失');
page.$('#chart') + elementHandle.screenshot()
)await page.setRequestInterception(true);
page.on('request', req => {
if (req.resourceType() === 'image') req.abort();
else req.continue();
});
await page.waitForFunction(() => document.readyState === 'complete');
await page.waitForSelector('.loaded', { timeout: 10000 });
async function retry(fn, retries = 3) {
for (let i = 0; i < retries; i++) {
try {
return await fn();
} catch (err) {
if (i === retries - 1) throw err;
}
}
}
const allure = require('allure-commandline');
// 添加测试步骤与截图
allure.step('输入用户名', async () => {
await page.type('#username', 'testuser');
});
allure.attachment('登录截图', await page.screenshot(), 'image/png');
name: UI Tests
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: 16
- run: npm install
- run: npm test
- name: Upload Allure Report
uses: actions/upload-artifact@v2
with:
name: allure-report
path: ./allure-results
--disable-web-security
参数(仅限测试环境)通过深度整合Puppeteer与Selenium,开发者既能利用Chrome的高性能特性处理复杂场景,又可借助Selenium实现多浏览器覆盖。本文从工具原理、环境搭建到实战优化,提供了完整的解决方案。建议结合团队技术栈灵活调整工具组合,持续优化测试用例维护成本。