概要
Playwright 为现代Web应用提供可靠的端到端测试能力。支持所有现代渲染引擎,包括 Chromium、WebKit 和 Firefox。在 Windows、Linux 和 macOS 上进行测试,无论是本地还是 CI(持续集成)环境,无头模式(headless)或有头模式(headed)均可。可以使用 TypeScript、JavaScript、Python、.NET、Java 等语言调用 Playwright API。
实现流程
本文基于TypeScript,在nodejs环境下,实现了抖音平台的自动登录和发布流程。
- 1.登录
通过Playwright打开一个浏览器,导航到抖音登录页面,扫码登录后,自动保存登录后的Cookie信息,便于后面的发布。 - 2.视频发布
通过Playwright的setInputFiles接口,设置上传视频的路径,自动点击发布按钮。
代码实现
// An highlighted block
const fs = require('node:fs');
import { firefox } from 'playwright';
class Playwright {
async login() {
const storageStatePath = './storageState/douyin.json';
let storageState = {};
if (fs.existsSync(storageStatePath)) {
storageState = JSON.parse(fs.readFileSync(storageStatePath, 'utf-8'));
}
const browser = await firefox.launch({
headless: false,
}); // Or 'firefox' or 'webkit'.
const context = await browser.newContext({ storageState: storageState });
context.setDefaultTimeout(60 * 1000);
const page = await context.newPage();
await page.goto('https://creator.douyin.com/').catch((error) => {
console.error(error);
});
await page.waitForURL('https://creator.douyin.com/creator-micro/home');
await context.storageState({ path: storageStatePath });
const locator = await page.locator('div.rNsML');
const userName = await locator.innerText();
console.log('login userName', userName);
await browser.close();
return { userName: userName };
}
async upload(videoPath) {
const storageStatePath = './storageState/douyin.json';
const storageState = JSON.parse(fs.readFileSync(storageStatePath, 'utf-8'));
const browser = await firefox.launch({
headless: false,
}); // Or 'firefox' or 'webkit'.
const context = await browser.newContext({ storageState: storageState });
context.setDefaultTimeout(60 * 1000);
const page = await context.newPage();
await page.goto('https://creator.douyin.com/creator-micro/content/upload');
await page.setInputFiles('.upload-btn-input--1NeEX', videoPath);
await page.waitForURL(
'https://creator.douyin.com/creator-micro/content/publish?enter_from=publish_page',
);
const orderSent = page.locator('.preview-button--2QRRr', {
hasText: '重新上传',
});
await orderSent.waitFor({ state: 'visible', timeout: 20000 });
await page.getByRole('button', { name: '发布', exact: true }).click();
await page.waitForURL(
'https://creator.douyin.com/creator-micro/content/manage?enter_from=publish',
);
await browser.close();
return { status: 'ok' };
}
}
export default new Playwright();
小结
通过上述流程,我们也可以实现其他平台登录和发布流程,最终形成产品效果如下。
欢迎添加微信【sas-soft】沟通交流。