Как использовать модуль url на странице кукловода - PullRequest
0 голосов
/ 24 февраля 2019

Я уже попробовал все, что упомянуто в Ошибка: ошибка оценки: ReferenceError: util не определен и Как передать требуемый объект модуля на страницу кукловода. Оценить .В частности, я попытался преобразовать url.js с помощью browserify (я также попытался преобразовать вместе url.js и punycode.js) и добавил соответствующий сценарий (bundle.js) в среду страницы.

Я пытаюсь использовать модуль url внутри page.evaluate () в кукловоде.Вот очень простой пример, показывающий ошибку:

const puppeteer = require('puppeteer');

puppeteer.launch({dumpio: true}).then(async browser => {
  const page = await browser.newPage();
  const response = await page.goto('https://www.google.com');
  await page.waitFor(5000);
  const pageUrl = page.url();
  await page.addScriptTag({path: 'bundle.js'});
  await page.evaluate(pageUrl => {
    const anchors = Array.from(document.querySelectorAll('a'));
    for (let anchor of anchors) {
      const href = anchor.getAttribute('href');
      let hrefUrl;
      try {
        hrefUrl = new URL(href);
      } catch (e) {
        hrefUrl = new URL(href, pageUrl);
      }
      console.log(url.format(hrefUrl, {fragment: false}));
    }
  }, pageUrl);
  await page.close();
  await browser.close();
});

В этом примере генерируется следующая ошибка:

(узел: 23667) UnhandledPromiseRejectionWarning: Ошибка: Ошибка оценки: ReferenceError: urlне определен в pageUrl ( puppeteer_evaluation_script : 11: 19) в ExecutionContext.evaluateHandle (/home/webb/node_modules/puppeteer/lib/ExecutionContext.js:97:13) в process._tickCallback (внутренний /process / next_tick.js: 188: 7)

Что еще нужно сделать, чтобы распознать модуль url?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Предоставьте доступ ко всем функциям из пакета url, используя page.exposeFunction.

Переберите экспорт модуля и добавьте каждую функцию для показа

var url = require('url');

var functionsToExpose = [];
for(let key of Object.keys(url)){
    if(typeof url[key] == 'function'){
        functionsToExpose.push({name: 'url'+key, func: url[key]});
    }
}

Предоставьте их на страницу

for(let item of functionsToExpose){
    await page.exposeFunction(item.name, item.func);
}

Каждая функция пакета url будет переименована.url.parse доступен с помощью urlparse.

0 голосов
/ 24 февраля 2019

Вариант с page.exposeFunction():

'use strict';

const url = require('url');
const puppeteer = require('puppeteer');

puppeteer.launch({ dumpio: true }).then(async browser => {
  const page = await browser.newPage();
  await page.exposeFunction('formatURL', formatURL);

  const response = await page.goto('https://www.google.com');
  await page.waitFor(5000);
  const pageUrl = page.url();

  await page.evaluate(async (pageUrl) => {
    const anchors = Array.from(document.querySelectorAll('a'));
    for (const anchor of anchors) {
      const href = anchor.getAttribute('href');
      const hrefUrl = await formatURL(href, pageUrl);
      console.log(hrefUrl);
    }
  }, pageUrl);

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

function formatURL(href, base) {
  try {
    return url.format(new URL(href), { fragment: false });
  } catch (e) {
    return url.format(new URL(href, base), { fragment: false });
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...