Puppeteer всегда неопределен, но devtools работает для вложенных списков узлов - PullRequest
0 голосов
/ 03 ноября 2018

Я новичок в Puppeteer и не совсем уверен, что я делаю здесь не так, но в DevTools я получаю правильный вывод. Тем не менее, я хочу создать файл со значениями и продолжаю получать undefined.

Я думаю, что это как-то связано со списками узлов и невозможностью их вернуть, но я понятия не имею, как это исправить.

Это работает в DevTools:

let arr2 = Array.from(document.querySelectorAll(
  "#data > div.data-wrapper > div > div > table > tbody  tr"))
.map(row => (
  {site:row.querySelector('td:nth- child(2)').innerText,
  pass:row.querySelector('td:nth- child(10)').innerText,
  user:row.querySelector('td:nth-child(9)').innerText
  }))
  //with a console.log()

Я также пытался row.evaluate(()=>), который не работал для меня.

Вот мой код, который не работает:

(async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
    await page.authenticate({ username: "username", password: "password" });
    await page.goto("https://website/.../all");
    await page.waitFor(120000); // beacuse It loads everything slowly and times out the default 30000

    console.log("started evalating");
    var data = await page.evaluate(() => {
      Array.from(
        document.querySelectorAll(
          "#data > div.data-wrapper > div > div > table > tbody  tr"
        )
      ).map(row => {
        return {
          site: row.querySelector("td:nth-child(2)").innerText,
          pass: row.querySelector("td:nth-child(10)").innerText,
          user: row.querySelector("td:nth-child(9)").innerText
        };
      });
    });
  console.log(data);
})();

//I want an array of objects but the result throws errors or comes back with [undefined,......]

1 Ответ

0 голосов
/ 03 ноября 2018

Функция страницы, переданная в page.evaluate(), пропускает оператор return и поэтому не возвращает значение. В результате переменная data равна undefined.

Есть две дополнительные детали, на которые следует обратить внимание:

  1. Array.from() имеет встроенную функцию map.

    Array.from(arrayLike, mapFn)     // good
    Array.from(arrayLike).map(mapFn) // bad
    
  2. Вы должны использовать let или const вместо var всякий раз, когда это возможно.

    let data = ... // good
    var data = ... // bad
    

Вот ревизия вашего кода, которая должна работать правильно:

'use strict';

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    headless: false,
  });

  const page = await browser.newPage();

  await page.authenticate({
    username: 'username',
    password: 'password',
  });

  await page.goto('https://website/.../all');

  await page.waitFor(120000);

  console.log('started evalating');

  let data = await page.evaluate(() => {
    return Array.from(
      document.querySelectorAll('#data > div.data-wrapper > div > div > table > tbody tr'),
      row => ({
        site: row.querySelector('td:nth-child(2)').innerText,
        pass: row.querySelector('td:nth-child(10)').innerText,
        user: row.querySelector('td:nth-child(9)').innerText,
      })
    );
  });

  console.log(data);
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...