Node.js puppeteer - использовать значения из массива в цикле для циклического перемещения по страницам - PullRequest
0 голосов
/ 29 августа 2018

Я использую node.js и puppeteer для получения некоторых данных. ... теперь я хочу посещать разные страницы на основе неправильных значений из массива:

Мой массив выглядит так:

rows = [ RowDataPacket {
            id: 1,
            value: 'L3',
            name: 'Steve' },
        RowDataPacket {
            id: 2,
            value: 'GU',
            name: 'Peter' },        
        RowDataPacket {
            id: 3,
            value: 'M5',
            name: 'John' }]

Итак, страницы, которые я хочу посетить:

await page.goto('url/search?action=getname&name=L3', {waitUntil: 'load'});  
await page.goto('url/search?action=getname&name=GU', {waitUntil: 'load'});  
await page.goto('url/search?action=getname&name=M5', {waitUntil: 'load'});

Массив на самом деле имеет длину 200 значений ... поэтому я подумал о создании такого цикла:

await page.goto('url', {waitUntil: 'load'});

rows = [ RowDataPacket {
            id: 1,
            value: 'L3',
            name: 'Steve' },
        RowDataPacket {
            id: 2,
            value: 'GU',
            name: 'Peter' },        
        RowDataPacket {
            id: 3,
            value: 'M5',
            name: 'John' }]

console.log(rows.length); // 3

for (let i=1; i < rows.length; i++){

    await page.goto('url/search?action=getname&name='+value, {waitUntil: 'load'});  

}

Но как я могу получить доступ к значениям ('value') из массива и соответственно использовать его в цикле?

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Я не уверен, что находится в массиве rows, так как [ RowDataPacket { не является допустимым JavaScript, но при условии, что это заменяет фактические данные, и каждая строка имеет свойство value, вы можете использовать более простой синтаксис:

for (const row of rows) {
  await page.goto(`url/search?action=getname&name=${row.value}`);
}

Если вы хотите каждый раз создавать новую страницу, согласно ответу Эмеуса, вы можете заключить ее в try / finally:

for (const row of rows) {
  const page = await browser.newPage();
  try {
    await page.goto(`url/search?action=getname&name=${row.value}`);
  } finally {
    await page.close();
  }
}

Примечания:

0 голосов
/ 29 августа 2018

Я бы поместил browser.newPage(); внутри цикла, вот так:

const page = []

    for (let i=1; i < rows.length; i++){

        page[i] = await browser.newPage();
        await  page[i].goto('url/search?action='+rows[i].name+'&name='+rows[i].value, {waitUntil: 'load'});

    }

Тогда в том же или другом для:

const newPage = await page[i].evaluate(() => {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...