2015-06-20 12 views
7

Ich habe dieses Beispiel verwendet, um einen Phantomjs-Code zu erstellen, um mich auf der Website anzumelden.PhantomJS eine Seite nach der anderen öffnen

var page = require('webpage').create(); 
page.open("http://www.facebook.com/login.php", function(status) { 

    if (status === "success") { 
    page.onConsoleMessage = function(msg, lineNum, sourceId) { 
     console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")'); 
    }; 
    page.evaluate(function() { 
     console.log('hello'); 
     document.getElementById("email").value = "email"; 
     document.getElementById("pass").value = "password"; 
     document.getElementById("u_0_1").click(); 
     // page is redirecting. 
    }); 
    setTimeout(function() { 
     page.evaluate(function() { 
     console.log('haha'); 
     }); 
     page.render("page.png"); 
     phantom.exit(); 
    }, 5000); 
    } 
}); 

Von diesem Link. https://gist.github.com/ecin/2473860

Aber ich möchte einen anderen Link von einer Schaltfläche öffnen oder direkt darauf gehen. Wie kann ich es tun?

Hier ist ein einfacheres Beispiel. Funktioniert nicht ...

var page = require('webpage').create(); 
var url = "www.example.com"; 

page.open(url, function (status) { 

    setTimeout(function() { 
     page.evaluate(function() { 
      console.log('haha'); 
     }); 
     page.render("example.png"); 
     phantom.exit(); 
    }, 5000); 

}); 



var url = "www.google.com"; 

page.open(url, function (status) { 

    setTimeout(function() { 
     page.evaluate(function() { 
      console.log('haha'); 
     }); 
     page.render("google.png"); 
     phantom.exit(); 
    }, 5000); 

}); 
+0

Hinweis: PhantomJS hat eine andere Ausführungsumgebung als der Knoten. Es gibt Brücken zwischen Knoten und PhantomJS, aber sie sind etwas anders geschrieben. –

Antwort

7

Sehr nah, jetzt kombinieren Sie Ihre zwei Schnipsel in einem. page.open() ist asynchron, weshalb Sie die nächste Seite zu öffnen, müssen erst nach dem ersten fertig ist:

var page = require('webpage').create(); 
var url = "http://www.example.com"; 

page.onConsoleMessage = function(msg, lineNum, sourceId) { 
    console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")'); 
}; 

page.open(url, function (status) { 
    page.onConsoleMessage = function(msg, lineNum, sourceId) { 
     console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")'); 
    }; 
    page.evaluate(function() { 
     document.getElementById("email").value = "email"; 
     document.getElementById("pass").value = "password"; 
     document.getElementById("u_0_1").click(); 
     // page is redirecting. 
    }); 

    setTimeout(function() { 
     page.evaluate(function() { 
      console.log('haha'); 
     }); 
     page.render("example.png"); 


     var url = "http://www.google.com"; 

     page.open(url, function (status) { 
      setTimeout(function() { 
       page.evaluate(function() { 
        console.log('haha'); 
       }); 
       page.render("google.png"); 
       phantom.exit(); 
      }, 5000); 
     }); 
    }, 5000); 
}); 

Um tatsächlich zu sehen die console.log() innerhalb von page.evaluate() müssen Sie das page.onConsoleMessage Ereignis registrieren. Es gibt mehr andere Ereignisse, die beim Debuggen hilfreich sind.

Vergessen Sie nicht, den URLs, die Sie öffnen, das Protokoll (http: // oder file: ///) hinzuzufügen. PhantomJS ist in dieser Hinsicht ein bisschen wählerisch.

Statt eine statische Zeitspanne (setTimeout()) zu warten, bis die nächste Seite geladen wird, nachdem Sie eine Aktion ausgeführt haben. Sie sollten das Ereignis page.onLoadFinished verwenden. Dies ist ziemlich umständlich, um für navigationsintensive Skripte geeignet zu sein. Verwenden Sie CasperJS für längere Skripte.

Oft Element.click() funktioniert nicht. This question hat viele Lösungen für diese Fälle.

+1

Ok. Dies hat aber funktioniert, wenn ich etwas in das Google-Suchfeld eingeben und die Taste drücken möchte, um zu suchen. Dann bekomme ich Suchergebnisse gerendert? – macroscripts

+1

@macroscripts Google ist eine wirklich schlechte Seite, um mit PhantomJS zu experimentieren. Aber Sie würden 'page.evaluate()' verwenden, um den Wert eines Eingabefeldes zu ändern, und klicken Sie auf die Schaltfläche Suchen (http://stackoverflow.com/questions/15739263/phantomjs-click-an-element). Sie können auch 'page.sendEvent()' verwenden, um das Feld zu füllen und hoffen, dass die sofortigen Ergebnisse für PhantomJS aktiviert sind. –

+0

Ich benutze Google als Beispiel. Ich mache diesen Code auf der Website. Es hat verschiedene Domänen. Ich muss mich von sub1.domain.com einloggen und auf sub2.domain.com zugreifen. Ich möchte ein paar Daten davon bekommen. Der Code, den Sie mir gaben funktioniert, aber nicht vollständig. Es geht zu Sub1, loggt sich aber nicht richtig ein. Und es geht zu Sub2, aber ich sehe meinen Benutzernamen nicht angemeldet. Ich werde das Beispiel einfügen, das ich später verwendete. – macroscripts

Verwandte Themen