代码之家  ›  专栏  ›  技术社区  ›  Richlewis

在Puppeter实例中运行循环

  •  0
  • Richlewis  · 技术社区  · 7 年前

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

    我有一个JSON对象,其中包含我想访问的URL,所以我想循环访问它

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

    我的《木偶师》剧本如下

    // 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
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   yue you    7 年前

    你的 Object.keys 回调函数也需要使用async才能在内部使用Wait。尝试按以下方式更改

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

    希望有帮助