Возможно ли включить исходный файл в nodejs + puppeteer для добавления функций? - PullRequest
0 голосов
/ 23 мая 2018

Я знаю

await page.evaluateOnNewDocument(fs.readFileSync('./helperFunctions.js', 'utf8'));

для добавления функций в evaluate() контекст, что очень удобно.

Но может ли кто-нибудь привести какой-либо пример того же самого в основном контексте?Например, я хочу добавить функцию

page.existsText()

или

existsText()

с этим кодом из файла, который будет включен / получен :

existsText = (string) => {
    // code goes here
}

Какой путь?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Если я правильно понимаю ваше намерение , вы хотели бы импортировать функции из файла в глобальное пространство имен , не назначая их промежуточной переменной.Вот простой способ сделать это в узле.

helperFunctions.js

(function(){
    // Assign the function to the scope from where it's called
    this.existsText = (string) => {
        console.log("Do stuff with " + string);
    }
})()

Затем, когда вам это требуется в скрипте node.js / puppeteer, он выполняется сразуприсвоение функций из него глобальной области действия:

require("./helperFunctions");

existsText("global scope");

Результат:

Выполнение операций с глобальной областью действия


Bonus : использование тех же функций в page.evaluate

При необходимости можно использовать тот же вспомогательный файл в области видимости браузера:

await page.evaluateOnNewDocument(fs.readFileSync('./helperFunctions.js', 'utf8'));

await page.evaluate(() => { 
    existsText("browser scope");
});

Выполнять операции в области видимости браузера

0 голосов
/ 23 мая 2018

Вы можете добавить некоторые методы класса Page из объекта страницы для быстрого взлома.

const puppeteer = require("puppeteer");

puppeteer.launch().then(async browser => {
  const page = await browser.newPage();

  // page constructor is Page, 
  // and we can add some other methods to it's prototype
  page.constructor.prototype.myCustomMethod = function() {
    return this._frameManager.mainFrame().url();
  };

  await page.goto("https://example.com");
  const customUrl = await page.myCustomMethod();

  console.log({ customUrl }); // Returns { customUrl: 'https://example.com/' }
  await browser.close();
});

Это так же просто, как и для некоторых быстрых взломов.Итак, давайте добавим к этому метод exists.

// get all arguments
page.constructor.prototype.existsText = function(...args) {
  // let's assume the argument as a variable called string
  return this._frameManager.mainFrame().evaluate(string => {
    // create a new regex to find global multiline insensitive results
    const searchRegex = new RegExp(string, "gmi");
    // find all matchs
    return document.querySelector("body").outerHTML.match(searchRegex);
  }, args); // pass all arguments
};
const foundText = await page.existsText("more");
console.log({ foundText }); 
// Result: { foundText: [ 'More' ] }

Опять же, все это быстрые хаки и имеют свои ограничения.Не стесняйтесь исследовать.

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