如何将puppeteer浏览器设置为变量?

时间:2018-06-02 20:05:46

标签: javascript puppeteer

我尝试启动一个浏览器并根据需要使用它,但我不知道如何将其设置为变量。

// return promise
puppeteer.launch()

这个:

// It's not working
let bro;
puppeteer.launch()
    .then(res => bro = res);

这个:

//It's not working too
let bro;
puppeteer.launch()
    .then(res => bro = res);
while (bro === undefined) {

}
bro.newPage();

请告诉我如何启动浏览器并根据需要使用它:

//
let bro
// launch browser
bro.newPage()
...

例如在react中我可以调用异步函数

axios.post("/postOnePage", data)
                    .then(res => {
                        this.setState({onePageCount: res.data.wordCount});
                    })
                    .catch(err => console.log(err))

将结果设置为变量并根据需要使用

3 个答案:

答案 0 :(得分:4)

如果您使用 InheritableThreadLocal

,这非常简单
async/await

注意将其包装在 const browser = await puppeteer.launch(); const page = await browser.newPage(); 功能 中。

基本上async返回一个解析为浏览器实例的promise。因此,您只需初始化变量,就可以获得浏览器。使用 puppeteer.launch() ,我认为这将是一个混乱,您必须在 then 块中工作。

then

您也可以参考Puppeteer API 。文档非常好用例子。希望它能有所帮助。

编辑1:
示例工作示例:

const browser = puppeteer.launch();
browser.then((brw) => {
    const page = brw.newPage();
    page.then(pg => {
        pg.goto('https://example.com').then(() => {
            pg.screenshot({
                path: 'example.png'
            }).then(() => {
                brw.close();
            });
        });
    });
});

希望它有所帮助。

答案 1 :(得分:1)

我尝试了你的代码的第一个版本,即

let bro;
puppeteer.launch()
    .then(res => bro = res);

并且只有在使用关键字await之后才能使用

let bro;
await puppeteer.launch()
    .then(res => bro = res);

以下是我的代码运行方式

async function run(){
    let bro;
    await puppeteer.launch()
    .then(res => bro = res);

    const page = await bro.newPage();
    await page.goto('https://github.com/login');
    await bro.close();
}
run();

相同代码的另一个版本

let bro;
    await puppeteer.launch()
                   .then(async browser => {
                    bro = browser;
                   });

让我知道这是否有效。

版本2 由于节点环境是异步的,因此您必须使用alter来调用函数和传递变量。这是在run()之外可以使用浏览器varable的新代码。

var bro;
async function run(){
    await puppeteer.launch()
    .then(res => bro = res);

    const page = await bro.newPage();
    await page.goto('https://github.com/login');

}

//another function
async function another(){
    console.log('2')
    const page = await bro.newPage();
    await page.goto('https://github.com');
    await bro.close();
}
run().then(() => another());

注意

中使用的最后一个函数中使用bro.close()关闭浏览器

答案 2 :(得分:0)

请在箭头功能

中尝试{}
// Try
let bro;
puppeteer.launch()
    .then(res => {bro = res});

// Try
const handleRes = (res) => {
    // do something with res here
}
puppeteer.launch()
    .then(handleRes);