Używam PhantomJS, aby zalogować się na stronie i zrobić coś. Witryna wykorzystała protokół OAuth do logowania. Kliknięcie przycisku "Logowanie" powoduje przejście do usługi OAuth. Tam wprowadź swoje dane uwierzytelniające i klikając "Prześlij", nastąpi przekierowanie z powrotem do oryginalnej witryny. Mój skrypt działa dobrze, ale opiera się na limitach czasu, które nie wydają się zbyt mocne.Jak mogę poczekać, aż strona będzie gotowa w PhantomJS?
Jak mogę przepisać ten kod, aby zamiast używać setTimeout
, mogę poczekać, aż strona będzie gotowa. Często widzę błędy, że strona nie jest gotowa i dlatego jQuery nie jest inicjowany.
Nie jestem zbyt dobry w JavaScript, więc przykład byłby pomocny. To właśnie zhackowałem razem po tuzinie Googlingów. Oto mój kod:
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 = '[email protected]';
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);
});
}
});
Proponuję rozpocząć od oddalenia się od góry zguby. – fmsf
Po pracy z tym przez ostatnie kilka tygodni, wiem teraz, co masz na myśli mówiąc o "górze zagłady". To piekło wywołania zwrotnego. –