Глобальная функция, объявленная на фоновой странице, не вызывается черезvaluHandle - PullRequest
3 голосов
/ 16 июня 2019

У меня есть глобальная функция на фоновой странице, например:

window.myfn = function(){
    return new Promise((resolve, reject) => { stuff; });
};

Я использую Jest и Puppeteer. Учтите это в моем test.js файле:

async function getBackgroundPage() {
    const targets = await browser.targets(),
        backgroundPageTarget = targets.find(
            target => target.type() === "background_page",
        ),
        backgroundPage = await backgroundPageTarget.page();

    return backgroundPage;
}

async function sendUpdate() {
    const bgPage = await getBackgroundPage(),
        argString = `() => window.myfn()`;
    await bgPage.evaluateHandle(argString);
    await sleep(30000);
}

getBackgroundPage буквально скопировано из документов , поэтому я надеюсь, что это правильно. Однако sendUpdate() не работает должным образом. В идеале, window.myfn должен быть вызван, но на самом деле он никогда не вызывается. Я знаю это, потому что:

  1. Я положил в него несколько console.log с, поэтому, если бы он был вызван, должен был быть какой-нибудь вывод журнала.
  2. 30-секундный сон дает мне достаточно времени, чтобы перейти к chrome://extensions и открыть консоль фоновой страницы через Inspect Views, и я не смог найти там никаких выходов журнала.

Нет ошибок как на фоновой странице, так и на консоли Jest. В чем проблема тогда? Почему эта глобальная функция не вызывается?

1 Ответ

1 голос
/ 16 июня 2019

Существует небольшая разница между назначением функции и передачей строки для функции evaluateHandleevaluate).

Если вы передадите функцию, функция будет вызываться внутри страницы.Если вы передадите строку, строка будет выполнена в контексте страницы.Это означает, что эти две строки делают разные вещи:

await bgPage.evaluate(() => console.log("test"););
await bgPage.evaluate('() => console.log("test");');

Первая строка будет выполнять функцию (и запускать console.log) внутри страницы.Однако вторая строка будет только объявлять функцию, а не вызывать ее.Поэтому, если мы передадим строку, нам нужно будет выполнить одно из следующих действий:

await bgPage.evaluate('console.log("test")'); // directly run console.log
await bgPage.evaluate('(() => console.log("test"))()'); // execute the function

Исправление вашего кода

Возвращаясь к вашему коду, это означает, что вы либоВы можете напрямую вызвать window.myfn() или передать аргумент как функцию:

await bgPage.evaluateHandle('window.myfn()'); // directly call the function
await bgPage.evaluateHandle(() => window.myfn()); // or pass as a function and not as string
...