2017-10-28 3 views
2

Ich versuche, Jquery in meine puppeteer Seite zu injizieren, weil document.querySelector nicht es für mich nicht schneiden:inject jquery in puppeteer Seite

async function inject_jquery(page){ 
    await page.evaluate(() => { 
    var jq = document.createElement("script") 
    jq.src = "https://code.jquery.com/jquery-3.2.1.min.js" 
    document.querySelector("head").appendChild(jq) 
    }) 
    const watchDog = page.waitForFunction('window.jQuery !== undefined'); 
    await watchDog; 
} 

Das Ergebnis ist es meist mal aus. Hat jemand eine Lösung?

+0

haben Sie versucht, 'document.getElementsByTagName ('Kopf') [0] .appendChild (jq) '? Da Sie 'src' einstellen, ist es auch möglich, das' load' -Ereignis des script-Elements anzuhören und dann zurückzugeben. – TDreama

Antwort

6

Ich habe page.addScriptTag verwendet, um js Dateien zu injizieren.

... 
await page.addScriptTag({url: 'https://code.jquery.com/jquery-3.2.1.min.js'}) 
... 

page.addScriptTag - Dokumentation

Arbeitsbeispiel puppeteer: 0.12.0

import { launch } from 'puppeteer' 
(async() => { 
    const browser = await launch({headless: false}); 
    const page = await browser.newPage(); 
    await page.goto('https://example.com', {waitUntil: 'networkidle'}); 
    await page.addScriptTag({url: 'https://code.jquery.com/jquery-3.2.1.min.js'}); 
    await page.close(); 
    await browser.close(); 
})(); 
+0

Dies gibt mir auch: Unbehandelte Ablehnung bei: Promise Promise { Fehler: Protokollfehler (Runtime.callFunctionOn): Ausführungskontext wurde zerstört. undefined – pguardiario

+0

Nevermind, ich musste vor diesem Teil eine 'awarte page.waitForNavigation()' hinzufügen. Dies ist die beste Lösung. – pguardiario

2

mit diesem für mich funktioniert.

async function inject_jquery(page){ 
     await page.evaluate(() => { 
     var jq = document.createElement("script") 
     jq.setAttribute('type','text/javascript'); 
     jq.src = "https://code.jquery.com/jquery-3.2.1.min.js" 
     return new Promise((resolve) => { 
      jq.addEventListener("load",()=> { 
       resolve(); 
      }); 
      document.getElementsByTagName("head")[0].appendChild(jq); 
     }); 
     }) 
     const watchDog = page.waitForFunction('window.jQuery !== undefined'); 
     await watchDog; 
    } 
+0

Das gibt mir: Unbehandelte Ablehnung bei: Promise Promise { Fehler: Protokollfehler (Runtime.callFunctionOn): Ausführungskontext wurde zerstört. undefined – pguardiario

+0

Ist Ihr Seitenobjekt beim Aufruf von 'inject_jquery' noch gültig? Können Sie den aufrufenden Code teilen? Aus akademischen Gründen könnte diese Antwort erklären, warum Ihr Skript fehlgeschlagen ist. Ich glaube, die Lösung von Nilobarp ist einfacher – TDreama

1

Ich tue dies:

await page.addScriptTag({ url: 'https://code.jquery.com/jquery-3.2.1.min.js' }); 
const title = await page.evaluate(() => { 
    const $ = window.$; //otherwise the transpiler will rename it and won't work 
    return $('h1 > span').text(); 
}); 
+0

Das funktioniert für mich. – Linh

3

Für diejenigen, die eine lokale Kopie von jQuery zu injizieren:

await page.addScriptTag({path: require.resolve('jquery')})