2016-05-05 10 views
0

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.

+0

Sie haben einen kritischen Tippfehler in Ihrer Funktion: 'docuement' ->' document'. – iurisilvio

+0

Behoben. Vielen Dank. Es stellt sich heraus, dass Typo nur in dieser Frage war, mein Code hat das nicht. – JawguyChooser

+0

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

Antwort

0

Die page existiert nur im Bereich phantomjs, nicht im Bereich der Webseite. Schreiben Sie es neu, um page.render außerhalb von page.evaluate auszuführen.

// first execute the submit 
page.evaluate(function() { 
    document.getElementById("terms_form").submit(); 
}); 
// waitFor run outside the page scope 
waitFor(function(){ 
    return page.evaluate(function() { 
     return document.getElementById("terms_form") == null; 
    }) 
}, function() { page.render('aftersubmit.png'); }); 
+0

aha, ich werde das testen. obwohl, ich habe tatsächlich die ganze Sache (innerhalb des if ("Erfolg") innerhalb einer page.avalate. Ich hätte das in meine Frage setzen sollen, ich werde es jetzt bearbeiten. – JawguyChooser

+0

So ist das Problem das Gegenteil. Sie don Habe keine 'Seite', um' page.render' dort auszuführen. – iurisilvio

+0

Warte, wie hätte ich keine Seite in einer page.evaluate()? – JawguyChooser