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);
        });
    }
});
Je vous suggère de commencer par déplacer loin de la montagne du destin
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