2016-07-03 9 views
0

Ich brauche die Ajax-Daten von der Website uns PhantomJS zu bekommen. Daten werden angezeigt, wenn Sie auf den Link klicken.Klicken Sie auf den Link PhantomJS

<div class="show-all-goods"><a href="#">Show all</a></div> 

Hier ist mein Code:

var page = require('webpage').create(); 
page.open('http://dveri.com/catalog/dveri-mezhkomnatnyye/dveri-shponirovannyye/', function() { 
    page.includeJs("https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js", function() { 
    page.evaluate(function(){ 
     $('.show-all-goods a').click(); 
    }); 

}); 
console.log(page.content); 
phantom.exit(); 
}); 

Aber die Daten werden nicht geladen. Hilf mir, bitte

Antwort

0

Wenn Sie versuchen, die Daten mit der Zeile console.log(page.content); anzuzeigen, rufen Sie tatsächlich diese Funktion auf, noch bevor das Klicken passiert.

Think asynchron.

wird der Klick nach dem Laden der Seite ausgeführt und die js injiziert wird, und man kann nie wissen, wann ist, dass auf dem Server, Netzwerkverzögerung usw.

Leider PhantomJS nicht über API für Ajax Rückrufe je passieren wird .

Bisher habe ich für ähnliche Situationen einen Beobachter geschrieben, der ständig ein oder mehrere HTML-Elemente überwacht, die vom Ajax-Callback betroffen sind. Sagen wir zum Beispiel, es gibt ein Div, das jetzt leer ist und der Ajax-Callback wird das mit etwas Inhalt füllen. Ich habe eine setInterval oder setTimeout in PhantomJS-Code erstellt und evaluate aufgerufen, die ihrerseits Änderungen in diesem div. Von dieser Evaluierungsfunktion habe ich basierend auf dem, was ich bekommen habe, einen booleschen Wert zurückgegeben und weitere Schritte unternommen. Sie können jedoch auch stattdessen den Inhalt zurückgeben, den Sie in Ihre console.log eingeben können, und dann die Anwendung beenden.

Dies kann leicht getan werden, wenn Sie casperJS (http://casperjs.org/) verwenden wie wait() waitFor() eine der vielen APIs waitForResource() waitForSelector() waitWhileSelector() waitForSelectorTextChange() waitForText() waitUntilVisible() waitWhileVisible()