2016-07-19 9 views
1

Ich habe meine Fehler mit dem folgenden Code für PhantomJS (Windows 10, 2.1.1) neu erstelltphantomjs stoppt zufällig; kein Fehler beim Zugriff auf Dokument

var page = require('webpage').create(); 
page.open('http://phantomjs.org/', function (status) { 
    var doc = page.evaluate(function() { 
     return document; 
    }); 
    var extractor = function (title) { 
     console.log("extractor:called with title = " + title) 
     var a = doc.getElementById(title); 
     var z = a.childNodes[3].childNodes[1].childNodes[0]; 
     console.log("z: " + z); 
    }; 
    extractor("feature-01"); 
    phantom.exit(); 
}); 

Ich bin ziemlich sicher, dass es mit der Tatsache zu tun hat, dass ich eine bin die Schaffung Funktion, die im Seitenkontext ausgewertet wird, um einen Verweis auf 'Dokument' zu erstellen, den ich mit einer separat definierten JS-Funktion verwenden kann.

Antwort

2

Ja, das war eine richtige Ahnung über Seitenkontext. Sie müssen alle Manipulationen tun mit der DOM Seiten innerhalb von page.evaluate() Funktion, weil native Objekte können nicht in die und aus der Sandbox Seitenkontext übergeben werden, nur Primitiven:

die Argumente und den Rückgabewert Zu der Evaluierungsfunktion muss ein einfaches primitives Objekt gehören. Die Faustregel: Wenn es über JSON serialisiert werden kann, ist es in Ordnung.

Verschlüsse, Funktionen, DOM-Knoten usw. funktionieren nicht!

Von http://phantomjs.org/api/webpage/method/evaluate.html

So modifizierte Version von Ihnen Skript wird diese Nähe:

var page = require('webpage').create(); 

// We want to receive console messages from the page context 
page.onConsoleMessage = function(msg, lineNum, sourceId) { 
    console.log('CONSOLE: ' + msg); 
}; 

page.open('http://phantomjs.org/', function (status) { 

    var feature1 = page.evaluate(function() { 

     var extractor = function (title) { 
      console.log("extractor:called with title = " + title) 
      return document.getElementById(title).childNodes[3].childNodes[1].childNodes[0].textContent.trim(); 
     }; 
     return extractor("feature-01"); 
    }); 

    console.log(feature1); 
    phantom.exit(); 
});