2015-06-20 7 views
7

Ho usato questo esempio per creare un codice phantomjs per accedere al sito web.PhantomJS apre una pagina dopo l'altra

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); 
    } 
}); 

Da questo collegamento. https://gist.github.com/ecin/2473860

Ma voglio aprire un altro collegamento da un pulsante o andare direttamente su di esso. Come posso farlo?

Ecco un esempio più semplice. Non funziona ...

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

Nota che PhantomJS ha un ambiente di esecuzione diverso rispetto al nodo. Esistono bridge tra i nodi e PhantomJS, ma sono scritti in modo leggermente diverso. –

risposta

7

Molto vicino, ora combina i due snippet in uno. page.open() è asincrona, che è il motivo per cui è necessario aprire la pagina successiva solo dopo che il primo ha terminato:

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); 
}); 

per vedere effettivamente la console.log() all'interno di page.evaluate() è necessario registrarsi per l'evento page.onConsoleMessage. Ci sono altri eventi utili durante il debug.

Non dimenticare di aggiungere il protocollo (http: // o file: ///) agli URL che stai aprendo. PhantomJS è un po 'schizzinoso al riguardo.

Anziché attendere una quantità di tempo statica (setTimeout()) finché non viene caricata la pagina successiva dopo aver eseguito un'azione. Si dovrebbe fare uso dell'evento page.onLoadFinished. Questo è piuttosto ingombrante per essere corretto per gli script di navigazione intensiva. Utilizzare CasperJS per gli script più lunghi.

Spesso non funziona Element.click(). This question ha molte soluzioni per questi casi.

+1

Ok. Questo ha funzionato, ma cosa succede se voglio inserire qualcosa nella casella di ricerca di Google e premere il pulsante per cercare. Quindi vengono visualizzati i risultati della ricerca? – macroscripts

+1

@macroscripts Google è un sito davvero pessimo per iniziare a sperimentare con PhantomJS. Ma dovresti usare 'page.evaluate()' per cambiare il valore di un campo di input e [clicca] (http://stackoverflow.com/questions/15739263/phantomjs-click-an-element) il pulsante di ricerca. Puoi anche usare 'page.sendEvent()' per riempire il campo e sperare che i risultati istantanei siano abilitati per PhantomJS. –

+0

Sto usando google come esempio. Sto facendo questo codice sul sito web. Ha diversi domini. Devo accedere da sub1.domain.com e accedere a sub2.domain.com. Voglio ottenere alcuni dati da esso. Il codice che mi hai dato funziona ma non completamente. Arriva a sub1 ma non effettua il login correttamente. E va a sub2 ma non vedo il mio nome utente registrato. Incollerò l'esempio che ho usato in seguito. – macroscripts