2017-09-23 1 views
0

Ich versuche mit Puppenspieler zu einer Seite zu navigieren, warte bis die Webapp einen bestimmten Zustand erreicht, mache einen Screenshot und gehe. Wenn der SPA in dem Zustand ist, in dem ich einen Screenshot machen möchte, ruft er eine Funktion auf. Ich habe Schwierigkeiten, meinen Kopf um Async-Js-Code zu wickeln.Puppenspieler machen einen Screenshot nachdem eine exponierte Funktion aufgerufen wurde

Mein Code sieht wie folgt aus: „. Session geschlossen Höchstwahrscheinlich wird die Seite geschlossen wurde“

const puppeteer = require('puppeteer'); 

const url = 'http://example.com/'; 
const width = 300; 
const height = 250; 
const path = '/vagrant/tmp/screenshot.jpg'; 

async function takeScreenshoot(url, width, height, path) { 
    "use strict"; 

    const browser = await puppeteer.launch(); 
    const page = await browser.newPage(); 
    await page.setViewport({width: width, height: height}); 

    await page.exposeFunction('interestingFunction', (async data => { 
     console.log('Interesting function has been called. Taking a screenshot now.'); 
     await page.screenshot({path: path}); 
     await browser.close(); 
    })); 

    await page.goto(url); 
} 

(async() => { 
    "use strict"; 
    await takeScreenshoot(url, width, height, path); 
})(); 

Aber wenn ich screenshot.js nennen, bekomme ich Warnungen über ein nicht behandelte Versprechen sagen

node --trace-warnings screenshot.js 

Interesting function has been called. Taking a screenshot now. 
(node:2572) Error: Protocol error (Runtime.evaluate): Session closed. Most likely the page has been closed. 
    at Session.send (/vagrant/node_modules/puppeteer/lib/Connection.js:167:29) 
    at Page._onConsoleAPI (/vagrant/node_modules/puppeteer/lib/Page.js:296:20) 
    at <anonymous> 
    at process._tickCallback (internal/process/next_tick.js:188:7) 
(node:2572) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. 
    at emitWarning (internal/process/promises.js:78:15) 
    at emitPendingUnhandledRejections (internal/process/promises.js:95:11) 
    at process._tickCallback (internal/process/next_tick.js:189:7) 

Wenn ich die await browser.close() von der Linie 18 gibt entfernen, ist keine Warnung, aber das Skript nie beendet.

Jetzt macht die interstingFunction() ein wenig mehr, aber es ist sicher, es dem Fenster für die Webanwendung auszusetzen. Ich habe versucht, ein Beispiel für ein minimales Skript oben zu geben, das immer noch fehlschlägt.

Ich benutze Knoten v8.5.0.

Bin ich damit falsch?

+0

Ihre 'page.goto (url)' Aufruf scheint zu sein, ist fehl am Platz. – nilobarp

+0

Ich folge dem Beispiel von https://github.com/GoogleChrome/puppeteer/blob/master/examples/custom-event.js, um die Funktion zuerst anzuzeigen und dann auf die Seite zu gehen. Bitte beachten Sie auch, dass '' browser.close(); '' in einem Callback erwartet wird, das innerhalb weniger Sekunden nach dem Laden der App aufgerufen wird. Es sollte also nicht wirklich wichtig sein. Moving 'award page.goto (url);' hat die Warnungen nicht zum Schweigen gebracht. – hjm27

Antwort

0

Ich nehme an, dass es einige Anrufer dieser Funktion gibt und Sie müssen sie nicht selbst mit evaluate aufrufen.

Imo, Browser.close sollte bis zum Ende bewegt werden und gehen Sie vor der Belichtung Funktion. Soweit in der Dokumentation exposeFunction gelesen wird, wenn ein Versprechen zurückgegeben wird, wird es erwartet. am Ende async/erwartet Zucker für Versprechungen

await page.exposeFunction('interestingFunction', (async data => { 
    console.log('Interesting function has been called. Taking a screenshot now.'); 
    await page.screenshot({path: path}); 
    await browser.close(); 
})); 

await page.goto(url); 

Und das ist mein ganzes Beispiel

const url = 'http://example.com/'; 
const width = 300; 
const height = 250; 
const path = './screenshot.jpg'; 

async function takeScreenshoot(url, width, height, path) { 
    const browser = await puppeteer.launch(); 
    const page = await browser.newPage(); 

    await page.goto(url, {waitUntil: 'load'}); 

    await page.exposeFunction('jjj', (async() => { 
     console.log('Interesting function has been called. Taking a screenshot now.'); 
     return await page.screenshot({path: path}); 
    })); 

    await page.evaluate(async() => { 
     const myHash = await window.jjj(); 
    }); 

    await browser.close(); 
    } 

(async() => { 
    await takeScreenshoot(url, width, height, path); 
})(); 
+0

Vielen Dank für Ihre Zeit! Ja, ich nenne nicht 'interestingFunction()' selbst. Leider kehrt Ihre vorgeschlagene Lösung zurück, ohne darauf zu warten, dass die exposed-Funktion mindestens einmal aufgerufen wird und daher keine Screenshots erstellt. Das ist der Grund hinter dem Versuch, den Browser innerhalb des Rückrufs in meinem ursprünglichen Beispiel zu schließen. – hjm27

Verwandte Themen