安装
使用npm或Yarn在Node.js项目中安装Playwright。需要Node.js 10或更高版本。
npm i playwright --save
注意:貌似不能使用全局安装,只能在相应的项目下安装,--save
是为了在packagejson
里面注册这个安装包。在安装过程中,Playwright
将下载Chromium
,Firefox
和WebKit
的浏览器二进制文件。
用法
一旦安装,你可以require playwright
在Node.js
,并启动任何3个浏览器(chromium
,firefox
和webkit
)。
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
// Create pages, interact with UI elements, assert values
await browser.close();
})();
async
关键字,将关键字放在函数声明的前面,以将其转换为异步函数。异步函数是一种知道如何预期await
使用关键字调用异步代码的可能性的函数.
async function hello() { return "Hello" };
hello();
调用该函数将返回一个
Promise
。这是异步函数的特征之一-确保将它们的返回值转换为Promise
。将async
关键字添加到函数中以告诉它们返回promise
,而不是直接返回值.
将
async
函数与await
关键字结合使用时,它的真正优势就显而易见了-实际上,它await
仅在async
函数内部起作用。可以将其放在任何基于异步基于Promise
的函数的前面,以在该行上暂停代码,直到实现Promise
,然后返回结果值。同时,可能正在等待执行机会的其他代码也会这样做。
脚本示例
实现自动发微博功能
此代码示例片段只实现了最简单的发微博功能,并未有错误处理等相关内容.
const { chromium } = require('playwright');
const readline = require('readline'); #输入输出,手机收到验证码后,输入验证码,根据输入的验证码填入界面对应的地方
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
class Ut {
/**
* 异步延迟
* @param {number} time 延迟的时间,单位毫秒
*/
static sleep(time = 0) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, time);
})
};
}
(async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
await Ut.sleep(5000);
await page.goto('http://www.weibo.com');
await Ut.sleep(8000);
await page.fill('#loginname', '<name>');
await page.fill('input[name=password]', '<password>');
await Ut.sleep(3000);
await page.click('div.login_btn');
await Ut.sleep(8000);
await page.click('#message_sms_login');
await Ut.sleep(5000);
var answer;
rl.question("请输入验证码:\n", async (input) => {
answer = input;
console.log(answer);
await page.fill('div.clearfix input:first-child', answer[0]);
await page.fill('div.clearfix input:nth-child(2)', answer[1]);
await page.fill('div.clearfix input:nth-child(3)', answer[2]);
await page.fill('div.clearfix input:nth-child(4)', answer[3]);
await page.fill('div.clearfix input:nth-child(5)', answer[4]);
await page.fill('div.clearfix input:last-child', answer[5]);
await page.click('#message_confirm');
// await page.screenshot({ path: `weather.png` });
await page.fill('textarea.W_input', process.argv[2]);
await page.click('a.W_btn_a');
await console.log('操作结束')
})
})();
启动代码
node filename 'weibocontent'