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

时间:2017-11-13 05:11:36

标签: node.js google-chrome-headless puppeteer

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

// 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)"
    }
]

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

1 个答案:

答案 0 :(得分:1)

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

首先,您无法通过页面元素进行评估。相反,您可以执行以下操作,

在单独的文件中,

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();
})();