Comment puis-je attendre que la page soit prêt en PhantomJS?
Je suis l'aide de PhantomJS pour vous connecter à un site de faire quelque chose. Le site utilisé OAuth pour la connexion. En cliquant sur le bouton "Connexion" sur la, vous emmène à la OAuth service. De là, vous entrez vos informations d'identification et en cliquant sur "Soumettre", vous obtenez redirigé vers le site d'origine. Mon script fonctionne très bien, mais s'appuie sur les délais d'attente qui ne semble pas trop robuste.
Comment puis-je réécrire ce code, de sorte qu'au lieu d'utiliser setTimeout
, je peux attendre jusqu'à ce que la page est prête. Je vois souvent des erreurs que la page n'est pas prêt et, par conséquent, jQuery n'est pas initialisé.
Je ne suis pas très bon en Javascript donc un exemple serait utile. C'est ce que j'ai bidouillé après une tonne de Googler. Voici mon code:
var page = require('webpage').create();
var system = require('system');
page.settings.resourceTimeout = 10000;
page.onResourceTimeout = function(e) {
console.log("Timed out loading resource " + e.url);
};
page.open('https://mysite.com/login', function(status) {
if (status !== 'success') {
console.log('Error opening url');
phantom.exit(1);
} else {
setTimeout(function() {
console.log('Successfully loaded page');
page.evaluate(function() {
$("#submit-field").click(); //Clicking the login button
});
console.log('Clicked login with OAuth button');
setTimeout(function() {
console.log('Addding the credentials');
page.evaluate(function() {
document.getElementById("username").value = '[email protected]';
document.getElementById("password").value = 'P@ssw0rd';
document.getElementById("Login").click();
});
console.log('Clicked login button');
setTimeout(function() {
//Inject some jQuery into the page and invoke that here
console.log('Clicked the export button');
}, 15000);
}, 15000);
});
}
});
Après avoir travaillé avec ce pour les deux dernières semaines, je sais maintenant ce que tu voulais dire par cette "montagne de la mort". Ce rappel de l'enfer.
OriginalL'auteur Mridang Agarwalla | 2014-06-10
Vous devez vous connecter pour publier un commentaire.
Il semble que la seule façon de le faire était d'utiliser des rappels à partir de la DOM de PhantomJS.
Assurez-vous d'installer page web, comme un nœud du module par le biais de la ngp.
npm install webpage --save
OriginalL'auteur Mridang Agarwalla
Une autre méthode serait d'étendre la phantomjs
waitfor.js
exemple.- Je utiliser ce perso mélange de méthode.
C'est mon
main.js
fichier:Et la
lib/waitFor.js
fichier (qui est juste un copier-coller de lawaifFor()
fonction de la phantomjswaitfor.js
exemple):Cette méthode n'est pas asynchrone, mais au moins suis-je assuré que toutes les ressources ont été chargés avant que j'essaie de les utiliser.
OriginalL'auteur Daishi