Phantomjs hat diese beiden wirklich praktischen Callbacks onLoadStarted
und onLoadFinished
, die es Ihnen ermöglichen, die Ausführung im Wesentlichen anzuhalten, während die Seite geladen wird. Aber ich habe gesucht und finde keine Entsprechung, wenn Sie auf eine Schaltfläche oder einen Hyperlink klicken()
. Es passiert ein ähnliches Laden der Seite, aber onLoadStarted
wird für dieses Ereignis nicht aufgerufen, vermutlich weil kein explizites page.open()
erfolgt. Ich versuche eine saubere Möglichkeit zu finden, um die Ausführung während dieses Ladevorgangs auszusetzen.
One-Lösung besteht offensichtlich in verschachtelten setTimeout's, aber ich möchte diesen Ansatz vermeiden, weil er hacky ist und auf Versuch und Irrtum beruht, anstatt auf etwas Zuverlässigem und Robusterem wie dem Testen gegen etwas oder dem Warten auf ein Ereignis.
Gibt es einen spezifischen Callback für diese Art des Seitenaufbaus, den ich übersehen habe? Oder gibt es vielleicht eine Art generisches Code-Muster, das mit dieser Art von Dingen umgehen kann?
EDIT:
Ich habe immer noch nicht herausgefunden, wie ich es zum Anhalten bringen kann. Hier ist der Code, der die Funktion onLoadStarted()
nicht aufruft, wenn ich den Befehl klicken()
aufrufe:
var loadInProgress = false;
page.onLoadStarted = function() {
loadInProgress = true;
console.log("Laden gestartet");
};
page.onLoadFinished = function() {
loadInProgress = false;
console.log("Laden beendet");
};
page.open(loginPage.url, function (status) {
if (status !== 'success') {
console.log('Netzwerkzugriff nicht möglich');
fs.write(filePath + errorState, 1, 'w');
phantom.exit();
} else {
page.evaluate(function (loginPage, credentials) {
console.log('innerhalb der loginPage evaluate Funktion...\n')
document.querySelector('input[id=' + loginPage.userId + ']').value = credentials.username;
document.querySelector('input[id=' + loginPage.passId + ']').value = credentials.password;
document.querySelector('input[id=' + loginPage.submitId + ']').click();
//var aTags = document.getElementsByTagName('a')
//aTags[1].click();
}, loginPage, credentials);
page.render(renderPath + 'postLogin.png');
console.log('gerendert nach dem Login');
I habe überprüft, dass die ID korrekt ist. Das page.render()
zeigt, dass die Informationen übermittelt werden, aber nur, wenn ich es in ein setTimeout() setze, sonst rendert es sofort und ich sehe nur die eingegebenen Anmeldeinformationen, bevor die Seite umgeleitet wird. Vielleicht fehlt mir noch etwas anderes?