2016-07-16 12 views
1

Ich versuche, eine Javascript-Methode mit CasperJS aufrufen. Die Webseite besteht einfach aus einem Link, der es mir ermöglicht, zu meinem Standardland zurückzukehren.CasperJS Invoke Javascript-Funktion auf Browser-Konsole

Ich möchte, dass CasperJS die Javascript-Methode aufruft, die nach dem Klicken auf den Link aufgerufen wird. Ich stellte fest, dass das Nachahmen eines Mausklicks auf den Link die JavaScript-Methode aufrufen würde, aber das tut es nicht. Ich habe die folgenden Methoden ohne Erfolg versucht:

casper.then(function() { 
     casper.click(x('//*[@id="defaultCountry"]')); 
     casper.evaluate(function() { 
       __doPostBack('cty$UK$default',''); //this is the javascript function. im not sure if thats how you would call it though 
     }); 

oder

this.clickLabel('Default Country', 'a'); 

Ich weiß, dass, wenn ich die JavaScript-Funktion auf der Browser-Konsole aufrufen, wird es funktionieren. Ich gebe einfach ein:

__doPostBack('cty$UK$default',''); 

in der Konsole und es magisch funktioniert. Jede Hilfe wird geschätzt!


Edit:

@Rippo Dies ist ein Ausschnitt von dem, was ich lief. Es scheint, als ob CasperJS meine Eval-Anweisung umgeht. Die letzten paar Zeilen stammen direkt von der Konsole. Ich weiß, dass meine Seite wegen des Screenshots mit dem Selektor geladen wird. Ich habe sogar die Methode casper.waitforselector zur Bestätigung verwendet. Diese

casper.thenOpen('http://example.com'); 

casper.wait(5000, function() { 
    console.log('page opened'); 
    casper.capture('page.png'); 
    console.log('capture page complete'); 
}); 

casper.thenEvaluate(function() { 
    console.log('invoking javascript'); 
    __doPostBack('cty$UK$default',''); 
    console.log('javascript invoked'); 
}); 

ist von der Konsole:

[info] [phantom] wait() finished waiting for 5000ms. 
page opened 
[debug] [phantom] Capturing page to C:/Users/page.png 
[info] [phantom] Capture saved to C:/Users/page.png 
capture page complete 
[info] [phantom] Step _step 8/8 http://example.com (HTTP 200) 
[info] [phantom] Step _step 8/8: done in 16240ms. 
[info] [phantom] Done 8 steps in 16259ms 
[debug] [phantom] Navigation requested: url=about:blank, type=Other, willNavigate=true, isMainFrame=true 
[debug] [phantom] url changed to "about:blank" 

Dies ist die letzte Zeile von der Konsole, bevor es austritt.


bearbeiten 2016.07.17 12.40

@Artjom B. Hier ist ein Ausschnitt aus dem Code, den ich mit Ihren Vorschlägen lief:

...snipped some prior  
function() { 
    console.log('Page loaded'); 
    casper.capture('page.png'); 
    console.log('Starting 1st postback call'); 
    this.evaluate(function() { 
     console.log('postback call'); 
     __doPostBack('cty$UK$default',''); 
     }); 
    console.log('passed postback'); 
    casper.capture('post-postback.png'); 

//At this point, it skips this function and goes straight to console.log then comes back to this function. Not sure why... 
casper.then(function() { 
    console.log('trying to change again'); 
    this.click(x('//*[@id="defaultCountry"]')); 
    this.evaluate(function() { 
     __doPostBack('cty$UK$default',''); 
     console.log('javascript invoked'); 
    }); 
}); 

//skipped to this console.log 
console.log('waiting country to change'); 
this.waitForSelector('.countryuk', 
    function() { 
     console.log('country change completed. Capturing image'); 
     this.capture('uk.png'); 
    }, 

    function() { 
     console.log('timed out waiting for country to change.'); 
     this.capture('uk-timeout.png'); 
    },5000); 

}; Hier

ist die Konsolenausgabe:

Page loaded 
[debug] [phantom] Capturing page to C:/Users/page.png 
[info] [phantom] Capture saved to C:/Users/page.png 
Starting 1st postback call 
Console: postback call 
Error: ReferenceError: Can't find variable: __doPostBack 
passed postback 
[debug] [phantom] Capturing page to C:/Users/post-postback.png 
[info] [phantom] Capture saved to C:/Users/post-postback.png 
waiting country to change 
[info] [phantom] Step anonymous 10/11 http://example.com/page.aspx?r=2 (HTTP 200) 
trying to change again 
[debug] [phantom] Mouse event 'mousedown' on selector: xpath selector: //*[@id="defaultCountry"] 
[debug] [phantom] Mouse event 'mouseup' on selector: xpath selector: //*[@id="defaultCountry"] 
[debug] [phantom] Mouse event 'click' on selector: xpath selector: //*[@id="defaultCountry"] 
Error: ReferenceError: Can't find variable: __doPostBack 
Error: ReferenceError: Can't find variable: __doPostBack 
[info] [phantom] Step anonymous 10/11: done in 22567ms. 
[info] [phantom] Step _step 11/11 http://example.com/page.aspx?r=2 (HTTP 200) 
[info] [phantom] Step _step 11/11: done in 22573ms. 
[warning] [phantom] Casper.waitFor() timeout 
timed out waiting for country to change. 
[debug] [phantom] Capturing page to C:/Users/uk-timeout.png 
[info] [phantom] Capture saved to C:/Users/uk-timeout.png 
[info] [phantom] Done 11 steps in 27825ms 
[debug] [phantom] Navigation requested: url=about:blank, type=Other, willNavigate=true, isMainFrame=true 
[debug] [phantom] url changed to "about:blank" 

Offensichtlich kann es nicht die Postbacks Funktion finden. Ich bin mir nicht sicher warum. Es ist kein verstecktes Element. Es ist genau so, wie ich oben gepostet habe (ein Link). Es ist in einer Reihe von div Tags verschachtelt, aber das ist es auch schon. Danke für Ihre Hilfe!

+0

ich ähnliche Probleme mit der Postbacks gesehen habe nennen Mein Problem ist, dass Casperjs tut Prozess meine Funktion eval und ich bin mir nicht sicher, warum. https: // Stapelüberlauf.com/questions/25107976/kann nicht-navigieren-mit-casperjs-evaluate-and-dopostback-funktion https://stackoverflow.com/questions/17830597/casperjs-how-to-call-dopostback – kubermeso

+0

Willkommen bei Stack Overflow! Welche PhantomJS Version verwendest du? Bitte registrieren Sie sich für die Ereignisse 'resource.error',' page.error', 'remote.message' und' casper.page.onResourceTimeout' ([Beispiel] (https://gist.github.com/artjomb/4cf43d16ce50d8674fdf#file) -2_caspererrors-js)). Vielleicht gibt es Fehler. –

+0

Sie haben meine erste Frage nicht beantwortet. Wie auch immer, Sie müssen herausfinden, warum die Anfrage, die die Funktion '__doPostBack' lädt, nicht geladen wird. Ist es eine HTTPS-Anfrage? –

Antwort

0

Sie können auf die href der Verbindung zugreifen und die eval Funktion verwenden.

var str = document.getElementById("defaultCountry").href; 
eval(str.substring(str.indexOf(":") + 1)); 
+0

Sobald ich var str deklariere, bricht CasperJS aus. Ich stelle console.log vor und nach deinem Code. Es würde das console.log vor, aber nicht danach interpretieren. – kubermeso

+0

@kubermeso Was meinst du mit "bricht aus"? Wo setzt du die Erklärung und den Eval Call? – afuous

+0

Bitte sehen Sie meine Bearbeitung oben. Ich setze Ihre Aussagen in die casper.thenEvaluate-Funktion. Ich habe es auch mit casper.wait getwittert. Weder work und casperjs umgehen nur den Code – kubermeso

1

was gerade (entfernen casper.then und casper.click)

casper.thenEvaluate(function() { 
     __doPostBack('cty$UK$default',''); 
}); 
+0

als eine Seitennotiz 'console.log ('Javascript aufrufen');' Innen mit Echo auf die Webbrowser-Konsole auswerten, nicht die Befehlskonsole, von der Sie es ausführen. Ich frage mich, ob das JS fertig geladen ist? Ich vermute, Sie haben irgendwo auf der Seite einen JS-Fehler. Siehe @artjom Kommentar – Rippo