【问题标题】:Running a loop within an instance of Puppeteer在 Puppeteer 实例中运行循环
【发布时间】:2018-02-07 07:18:16
【问题描述】:

刚开始使用 Puppeteer,我可以启动浏览器,转到一个 url,运行一系列操作,然后关闭浏览器。我想看看我是否可以做的是打开浏览器并在同一个会话中循环一组操作。

我有一个带有我想访问的 url 的 JSON 对象,所以想循环访问它

// teams.js
module.exports = {
  premier_league: [
    { team_name: "Team 1", url: "https://url-of-site/team_1"},
    { team_name: "Team 2", url: "https://url-of-site/team_2"}
  ]
}

我启动 puppeteer 的脚本如下

// index.js
const TEAM = require('./teams');
const puppeteer = require('puppeteer');

(async () => {
  // Initialise Browser
  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();
  await page.setViewport({
    width: 1280,
    height: 800
  });
  await page.goto('login page');

  await page.click('login_box');
  await page.keyboard.type('username');

  await page.click('login_password');
  await page.keyboard.type('password');

  await page.click('login_button');
  await page.waitForNavigation();

  // Go To Team URL
  await page.goto('Team URL')

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

所以要循环我的 JSON 对象,我可以使用

Object.keys(TEAM['premier_league']).forEach(function(key) {

  // Output url of each team
  console.log(TEAM['premier_league'][key]['url'])

});

如果我用我的循环包装我的 go to url,那么page 将不再可访问

// index.js
const TEAM = require('./teams');
const puppeteer = require('puppeteer');

(async () => {
  // Initialise Browser
  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();
  await page.setViewport({
    width: 1280,
    height: 800
  });
  await page.goto('login page');

  await page.click('login_box');
  await page.keyboard.type('username');

  await page.click('login_password');
  await page.keyboard.type('password');

  await page.click('login_button');
  await page.waitForNavigation();

  Object.keys(TEAM['premier_league']).forEach(function(key) {

    // Go To Team URL
    await page.goto(TEAM['premier_league'][key]['url'])

  });

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

实际错误是

await page.goto(TEAM[args][key]['url'])
    ^^^^

SyntaxError: Unexpected identifier

【问题讨论】:

    标签: node.js loops google-chrome puppeteer


    【解决方案1】:

    您的 Object.keys 回调函数也需要使用 async 才能在内部使用 await。尝试如下改变

    Object.keys(TEAM['premier_league']).forEach( async function(key) {
    
        // Go To Team URL
        await page.goto(TEAM['premier_league'][key]['url'])
    
    });
    

    希望对你有帮助

    【讨论】:

    • 啊好的,非常感谢,好消息是我可以注销urls,但就访问实际网址而言,我得到Unhandled promise rejection (rejection id: 1): Error: Protocol error (Page.navigate): Target closed.
    • 将你的异步函数放入 try catch 闭包并检查错误。似乎您的 page.goto() 由于某种原因失败了
    • 我不会使用异步执行 .forEach,它不会等待整个 Object.keys 循环,因此代码将继续执行。对于顺序异步/等待,更容易使用 for (const ... of ...) { // await stuff }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多