2016-04-06 14 views
3

ich mehrere Instanzen von CasperJS auf dem gleichen Prozess zu laufen versuche, sieht mein Testcode etwas wie folgt aus:Kann CasperJS mehrere Instanzen im selben Prozess ausführen?

['user1,pass1', 'user2,pass2'].forEach(function(account) { 
    var casperInstance = require('casper').create({ 
      verbose: true, 
      logLevel: "debug", 
      webSecurityEnabled: false, 
      pageSettings: { 
       loadImages: true, 
       loadPlugins: true, 
       userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4' 
      } 
    }); 

    runit(casperInstance, account); 
}); 

function runit(casperi, account) { 

    casperi.options.viewportSize = {width: 1920, height: 1080}; 

    var account = account.split(','); 

    casperi.start('https://www.example.com/login/', function () { 
     var x = require('casper').selectXPath; 

     this.fill('form.loginForm', { 
      'username': account[0], 
      'password': account[1] 
     }, false); 

     this.click(x('//*[text()="Log in"]')); 

    }).waitForUrl(/https:\/\/www.example.com\/$/, function then() { // have to use this because the form is submitted with ajax, is there a better way? 
     //this.echo(this.getHTML()); 
    this.echo('Logged in'); 
    }, function OnTimeout() { 
    this.echo('Login Failed'); 
    }, 20000); 

    casperi.run(); 
} 

Mit nur einem Konto auf dem Array es in Ordnung, aber mit zwei arbeitet oder mehr, die es immer Ich glaube nicht, dass mein Code mehrere casper-Instanzen ausführt, denn wenn ich den gesamten Login-Code ersetze, um nur den HTML-Code (oder irgendwas anderes) auszudrucken, druckt er ihn nur einmal.

Gibt es eine Möglichkeit, mehrere Instanzen von CasperJS im selben Prozess auszuführen, oder ist es die einzige Lösung, einen Starter zum Starten mehrerer Prozesse zu erstellen?

Antwort

2

Ja, Sie können mehrere casper Instanzen verwenden, aber Sie müssen bedenken, dass sie alle im selben PhantomJS-Prozess ausgeführt werden, der mit einem einzelnen Desktop-Browserfenster vergleichbar ist. Sie können viele Registerkarten verwenden, aber die Registerkarten teilen dieselben cookies/localStorage und daher dieselbe Sitzung.

Da Sie versuchen, die Anmeldung zu testen, die vermutlich über Cookies implementiert wird, kann dies nicht funktionieren. Der erste "Tab" öffnet die Login-Seite, versucht sich einzuloggen, kann erfolgreich sein. Aber der zweite "Tab" versucht dasselbe zur gleichen Zeit. Der Server erkennt dies wahrscheinlich, als ob der Benutzer einen Doppelklick gemacht hätte und nicht mit einem der beiden Logins oder nur mit einem von ihnen fortfährt (nur an dieser Stelle raten).

Der Schlüsselpunkt ist, dass wenn Sie verschiedene Sitzungen benötigen, können Sie nicht mehrere casper Instanzen in einem einzigen Prozess verwenden. Die naheliegende Lösung wäre, den Test für jede Kombination aus Benutzername und Passwort in mehreren PhantomJS-Instanzen laufen zu lassen (ein Pool von irgendeiner Art vielleicht).

+0

Ich frage mich, ob das ist, warum ich die richtigen Ergebnisse nicht erhalten kann, wenn Casper-Tests parallel gegen den gleichen Server laufen. Manchmal führen sie den Server mit den richtigen Daten aus, manchmal nicht. –

+0

@Canadian_Republican Nein, wahrscheinlich nicht. Aber wenn die Seite 'localStorage' verwendet, ist das wahrscheinlich das Problem. Das einzige, was PhantomJS standardmäßig auf der Festplatte hält, ist 'localStorage'. Daher können mehrere CasperJS-Instanzen, die in verschiedenen PhantomJS-Prozessen ausgeführt werden, die 'localStorage' des jeweils anderen überschreiben. Ich kann jedoch nicht sicher sein. –

Verwandte Themen