2014-12-03 13 views
7

Dies ist ein Follow-up zu dem Thema Set firefox profile with protractor.Konfigurieren mehrerer Funktionen mit Versprechen

Nach dem setFirefoxProfile Howto, ist es möglich, ein Firefox-Profil mit einem speziellen "helper" js code zu setzen, die firefox-profile und q Bibliotheken verwendet ein codiertes firefox Profil on the fly zu machen.

Das ist für mich gearbeitet, bis ich mehrere Browser zu Gebrauch versucht haben und multiCapabilities konfigurieren:

exports.config = { 
    seleniumAddress: 'http://localhost:4444/wd/hub', 

    multiCapabilities: [ 
     { 
      browserName: 'chrome', 
      specs: [ 
       'footer.disabledCookies.spec.js' 
      ], 
      chromeOptions: { 
       prefs: { 
        'profile.default_content_settings.cookies': 2 
       } 
      } 
     }, 

     ... 
     // other capabilities here 
     ... 

     helper.getFirefoxProfile()  
    }, 

    ... 
} 

Mit diesem Setup ich einen Fehler bin immer (full Zurückverfolgungs here):

Spezifikationsmuster stimmen nicht mit Dateien überein.

Wie ich verstehe, bedeutet dies, dass die Einrichtung mit Firefox-Profil specs Schlüssel fehlt. Mit anderen Worten, es kann keine Tests finden, die ausgeführt werden können.

Ich habe versucht, include specs into the capabilities dictionary inside the helper itself, aber der Fehler bleibt bestehen.

Wie den Fehler zu beheben und Firefox-Profil festlegen, wenn Sie multiCapabilities verwenden?


Als Abhilfe können, habe ich eine separate Winkelmesser Konfigurationsdatei mit nur firefox konfiguriert erstellt (mit capabilities) und stellen grunt Winkelmesser laufen zweimal - eine für dieses „firefox mit einem Profil“ config und das andere eins für alle anderen Browser.

+2

Ich öffnete ein Problem https://github.com/angular/protractor/issues/1594. Ich denke es ist was du willst. Bitte kommentieren Sie dieses Problem und verwenden Sie es, um Updates zu verfolgen. – hankduan

+1

@hankduan vielen Dank für die Ausarbeitung einer Feature-Anfrage. Bitte geben Sie eine Antwort (mit einigen technischen Details, die Sie in der GitHub-Ausgabe angegeben haben) und ich akzeptiere sie. Falls das Feature implementiert wird, aktualisieren wir die Antwort mit entsprechenden Anweisungen. – alecxe

Antwort

6

Gerade jetzt, Winkelmesser kann Versprechen nur als Fähigkeiten akzeptieren, wenn wir NICHT Multikapazitäten verwenden. Der Grund dafür ist, dass MultiCapabilities jede Aufgabe in einem neuen Prozess ausführt, so dass die Zusage (Funktion) nicht übergeben werden kann (einzelne Funktionen funktionieren, weil wir keine Verzweigungen ausführen).

Alternativ könnten wir die Funktionen im Launcher auflösen, bevor die aufgelösten Funktionen in die neuen Prozesse übernommen werden. Dies wird jedoch die Fähigkeit zum Einrichten von Proxys (https://github.com/angular/protractor/pull/1040), die darauf beruht, dass die Fähigkeit verspricht, nach dem Setup des Treiber-Providers aufgelöst werden, zu brechen.

Ich kann mir keine einfache Methode vorstellen (ohne große Refactoring), aber es ist definitiv machbar. Ich habe ein Problem für den Winkelmesser (https://github.com/angular/protractor/issues/1594) erstellt. Bitte folgen Sie diesem und/oder kommentieren Sie es, wenn Sie etwas benötigen oder Sie andere Ideen haben, um es zu implementieren.

Für jetzt müssten Sie die Workaround verwenden, die Sie in Ihrer ursprünglichen Frage erwähnt haben.

UPDATE

https://github.com/angular/protractor/pull/1629 unterstützt dies. Beginnend in Winkelmesser 1.6 (oder wenn Sie mit Master synchronisieren) können Sie eine Funktion an config.getMultiCapabilities wie onPrepare und onCleanup übergeben. Diese Funktion kann ein Versprechen an multiCapabilties (d. H. Array von capabilities) zurückgeben.

Siehe https://github.com/angular/protractor/blob/master/spec/getCapabilitiesConf.js für ein Beispiel.

+1

Das ist erstaunlich, versuchte das - es funktioniert! (Ich habe eine Antwort mit einem Beispiel hinzugefügt, wie ich den Winkelmesser mit 'getMultiCapabilities()' konfiguriert habe.) Ich werde dir ein zusätzliches Kopfgeld geben. Danke noch einmal! – alecxe

2

Im Anschluss an den pull request von @hankduan geschickt, hier ist, wie habe ich getMultiCapabilities() unterschiedliche Fähigkeiten zu kombinieren, verwendet, wo einer von ihnen ein Versprechen ist (erforderlich für firefox-profile eingestellt werden):

"use strict"; 

var FirefoxProfile = require("firefox-profile"); 
var q = require("q"); 

exports.config = { 
    seleniumAddress: "http://127.0.0.1:4444/wd/hub", 

    getMultiCapabilities: function() { 
     var deferred = q.defer(); 

     var multiCapabilities = [ 
      { 
       browserName: "chrome", 
       specs: [ 
        "footer.disabledCookies.spec.js" 
       ], 
       chromeOptions: { 
        prefs: { 
         "profile.default_content_settings.cookies": 2 
        } 
       } 
      }, 
      { 
       browserName: "chrome", 
       specs: [ 
        "*.spec.js" 
       ], 
       exclude: [ 
        "footer.disabledCookies.spec.js", 
        "footer.disabledJavascript.spec.js", 
        "footer.disabledFlash.spec.js" 
       ] 
      }, 
      { 
       browserName: "chrome", 
       specs: [ 
        "footer.disabledFlash.spec.js" 
       ], 
       chromeOptions: { 
        args: [ 
         "--disable-internal-flash", 
         "--disable-bundled-ppapi-flash", 
         "--disable-plugins-discovery" 
        ] 
       } 
      } 
     ]; 

     // Wait for a server to be ready or get capabilities asynchronously. 
     setTimeout(function() { 
      var firefoxProfile = new FirefoxProfile(); 
      firefoxProfile.setPreference("javascript.enabled", false); 
      firefoxProfile.encoded(function (encodedProfile) { 
       var capabilities = { 
        "browserName": "firefox", 
        "firefox_profile": encodedProfile, 
        "specs": [ 
         "footer.disabledJavascript.spec.js" 
        ] 
       }; 
       multiCapabilities.push(capabilities); 
       deferred.resolve(multiCapabilities); 
      }); 
     }, 1000); 

     return deferred.promise; 
    }, 

    ... 

}; 

Hoffnung würde dies helfen jemand in der Zukunft.

+1

Danke für das Beispiel. (Eine Sache: Sie brauchen nicht die setTimeout) – hankduan

+1

@hankdduan guter Punkt, aktualisiert. Vielen Dank. – alecxe

+0

@hankduan nicht sicher, warum, aber ohne 'setTimeout()' Winkelmesser wird mit Fehlercode 100 (keine fehlerhaften Tests obwohl). Hier ist ein [vollständiger Traceback] (https://gist.github.com/alecxe/446f15c78434665766db). Mit 'setTimeout()' keine Fehler, funktioniert. – alecxe

Verwandte Themen