如何将动态页面自动化命令从外部文件传递给 puppeteer?

How to pass dynamic page automation commands to puppeteer from external file?

我正在尝试将动态页面自动化命令从外部文件传递给 puppeteer。我是 puppeteer 和 node 的新手,所以我提前道歉。

// app.js
// ========

app.get('/test', (req, res) => 
(async () => {

const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('http://testurl.com');

var events = require('./events.json');

for(var i=0;i<events.length;i++){
  var tmp = events[i];
  await page.evaluate((tmp) => {  return Promise.resolve(tmp.event); }, tmp);   
} 

await browser.close();    
})());

我的活动 json 文件如下所示:

// events.json
// ========

  [
    {
        "event":"page.waitFor(4000)"
    },
    {
        "event":"page.click('#aLogin')"
    },
    {
        "event":"page.waitFor(1000)"
    }
]

我已经尝试了上述的几种变体以及导入将页面对象传递给模块函数之一的模块,但没有任何效果。谁能告诉我这是否可行,如果可行,如何更好地实现这一目标?

解决方法其实非常简单明了。你只需要了解它是如何工作的。

首先,你不能通过page这样的元素来评估。相反,您可以执行以下操作,

在单独的文件中,

module.exports = async function getCommands(page) {
    return Promise.all([
        await page.waitFor(4000), 
        await page.click("#aLogin"), 
        await page.waitFor(1000)
    ]);
};

现在在你的主文件上,

await require('./events.js').getCommands(page);

好了,完成了!它会按照你的意愿一条一条地为你执行所有命令。

这是经过一些调整的完整代码,

const puppeteer = require("puppeteer");


async function getCommands(page) {
    return Promise.all([
        await page.title(),
        await page.waitFor(1000)
    ]);
};

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto("https://example.com");

    let data = await getCommands(page);
    console.log(data);

    await page.close();
    await browser.close();
})();