Puppeteer-web: «кукольник - не конструктор»

Я пытаюсь следовать инструкции здесь, чтобы связать кукловода с намерением включить его в расширение Chrome как хакерский способ выполнения скриптовых операций в окне браузера (в частности, печать страницы в PDF, что на удивление невозможно только с помощью API расширения Chrome в качестве насколько я могу судить).

В соответствии с README в приведенной выше ссылке я настроил расширение Chrome следующим образом:

background.html

<script src="./puppeteer/utils/browser/puppeteer-web.js"></script>
<script src="background.js"></script>

background.js

const puppeteer = require("puppeteer");

Выдает ошибку puppeteer/utils/browser/puppeteer-web.js:10877 (anonymous function) Uncaught TypeError: Puppeteer is not a constructor.

Что мне здесь не хватает?

Версия Chrome: версия 69.0.3497.100

Версия узла: 7.4.0

Наконец кто-то задал вопрос о сети кукольников. : D Можете поделиться своим кодом?

Md. Abu Taher 26.10.2018 06:14

Я тестировал puppeteer-web, до сих пор он работал у меня абсолютно нормально. Можете ли вы сказать мне версию вашего браузера, версию узла и т. д., Чтобы мы могли понять, что не так?

Md. Abu Taher 26.10.2018 07:54

@ Md.AbuTaher Я обновил подробности!

Jess 26.10.2018 23:36

Я не могу понять, что в журнале ошибок написано Puppeteer, а не puppeteer. Вы уверены, что ошибка возникает, если вам просто нужна библиотека?

Md. Abu Taher 27.10.2018 12:07

Да, это ошибка в этой строке: module.exports = new Puppeteer(__dirname, preferredRevision, isPuppeteerCore);puppeteer-web.js). Есть ли другой способ на require, кроме как у меня выше?

Jess 27.10.2018 17:07

В качестве ответа предоставил рабочее решение, на всякий случай добавил проблему github.com/GoogleChrome/puppeteer/issues/3455. Мир.

Md. Abu Taher 27.10.2018 19:04
1
6
1 983
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Расширения Chrome не поддерживают unsafe-eval, поэтому кукловод не работает с расширением Chrome. Установите следующее на manifest.json.

"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"

Протестировано с помощью следующего кода,

const puppeteer = require('puppeteer');

async function getTitle() {
  const browser = await puppeteer.connect({
    browserWSEndpoint: 'ws://127.0.0.1:9222/devtools/browser/9f0a2240-2cb7-4efa-ac3c-8ef883d36d12',
  });
  const page = await browser.newPage();
  await page.goto('http://example.com');
  const title = await page.title();
  await page.close();
  await browser.disconnect();
  return title;
}

getTitle().then(console.log);

Результат:

Как я его нашел:

Код работает отлично, если я запускаю его напрямую или помещаю на страницу, но не работал только с расширением Chrome.

Проверка asyncawait помогла мне найти виновника.

let asyncawait = true;
try {
  new Function('async function test(){await 1}');
} catch (error) {
  asyncawait = false;
}

Спасибо!! Я предполагаю, что вы получили browserWSEndpoint, запустив chrome.exe со специальными флагами командной строки - знаете ли вы, есть ли способ программно получить эту конечную точку для другой вкладки в вашем собственном браузере (если кукловод работает в фоновом окне расширения) ?

Jess 27.10.2018 22:21

Другие вопросы по теме