Ich benutze diese WaitFor-Funktion (https://github.com/ariya/phantomjs/blob/master/examples/waitfor.js), um ein Formular zu senden, bevor Sie fortfahren. Die Webseite, die ich lade, hat eine modale Box, die erfordert, dass ich eine Cookie-Richtlinie akzeptiere, bevor ich gehe. Der Modal-Box ist ein Formularelement, und wenn ich die folgenden in meinem Browser tun, geht das Feld weg und ich kann dann die Seite verwenden:phantomjs waitFor Code funktioniert nicht
document.getElementById("terms_form").submit();
Daher dachte ich, ich sollte diese in der Lage sein, in PhantomJS zu tun:
page.open('http://thiswebpage.com/', function(status){
if(status === "success"){
page.evaluate(function(){
document.getElementById("terms_form").submit();
waitFor(function(){
return document.getElementById("terms_form") == null; },
function() { page.render('aftersubmit.png'); });
});
} else { console.log ("status: "+status) }
phantom.exit();
}
Also, was ist mir seltsam ist, dass Aftersumbit.png nie erstellt wird. Es ist also etwas grundsätzlich falsch mit meinem Code. Ich sehe auch keine Konsolenprotokollnachrichten von waitFor.
Ich muss etwas offensichtliches verpasst haben, aber ich bin seit einer ganzen Weile darauf fest, so dass ich dachte, ich würde um Hilfe bitten. Vielen Dank im Voraus.
Um ganz klar zu sein, im Web-Browser nach dem Ausführen von document.getElementById ("terms_form"). Submit(), die modale Box ist weg und führt den Test 'document.getElementById ("terms_form") == null 'gibt True zurück. Außerdem habe ich die Definition von waitFor (zu diesem Link gegeben, klebte hier der Einfachheit halber) an der Spitze meiner Datei:
"use strict";
function waitFor(testFx, onReady, timeOutMillis) {
var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3000, //< Default Max Timout is 3s
start = new Date().getTime(),
condition = false,
interval = setInterval(function() {
if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) {
// If not time-out yet and condition not yet fulfilled
condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
} else {
if(!condition) {
// If condition still not fulfilled (timeout but condition is 'false')
console.log("'waitFor()' timeout");
phantom.exit(1);
} else {
// Condition fulfilled (timeout and/or condition is 'true')
console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled
clearInterval(interval); //< Stop this interval
}
}
}, 250); //< repeat check every 250ms
};
EDIT: Ich habe auch page.onError wie folgt:
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item){
console.log(' ', item.file, ':', item.line);
});
}
Noch sehe ich keine Fehler gedruckt werden. Damit bin ich noch ein bisschen verloren. Ich habe einen kleinen Test des onError Handler wie folgt aus:
"use strict";
var page = require('webpage').create();
page.onConsoleMessage = function(msg){
console.log(msg);
}
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item){
console.log(' ', item.file, ':', item.line);
});
}
page.open('https://google.com/', function(status){
page.evaluate(function(){
referenceErrorGenerator.getElementById("foo");
});
phantom.exit();
});
Und das scheint gut zu funktionieren, ich
$ phantomjs onerror.js
ReferenceError: Can't find variable: referenceErrorGenerator
sehen Wenn ich versuche, um es auszuführen.
Ich frage mich, warum mein waitFor-Code nicht ausgeführt wird UND keinen Fehler gedruckt.
Sie haben einen kritischen Tippfehler in Ihrer Funktion: 'docuement' ->' document'. – iurisilvio
Behoben. Vielen Dank. Es stellt sich heraus, dass Typo nur in dieser Frage war, mein Code hat das nicht. – JawguyChooser
Außerdem habe ich gerade bemerkt, dass obwohl ich page.onError wie hier gezeigt hinzugefügt habe (http://phantomjs.org/troublesoulting.html), ich tatsächlich keine Fehlermeldungen auf der Konsole sehe, wenn ich absichtlich eine Error. In meiner Webkonsole geben Sie beispielsweise "dokuent.getElementById (" foo ");" erzeugt einen Uncaught ReferenceError, wobei ich diesen Dokuent-Tipp in meinen Phantomjs-Code setze, und wenn ich ihn ausführe, drucke ich keinen StackTrace, aber ich dachte, dass der onError-Code ihn gedruckt hätte. Mir muss hier etwas ganz Entscheidendes fehlen. – JawguyChooser