2014-12-03 26 views
7

Questo è un seguito all'argomento Set firefox profile with protractor.Configurazione di più funzionalità con promesse

Secondo la setFirefoxProfile howto, è possibile impostare un profilo firefox con una speciale "helper" js code che utilizza firefox-profile e q librerie per fare un profilo firefox codificato al volo.

questo ha lavorato per me fino a quando ho cercato di utilizzano più browser e la configurazione multiCapabilities:

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()  
    }, 

    ... 
} 

Con questa impostazione Sto ottenendo un errore (traceback completo here):

Gli schemi delle specifiche non corrispondevano a nessun file.

Come ho capito, questo significa che l'installazione con il profilo firefox manca la chiave specs. In altre parole, non riesce a trovare alcun test da eseguire.

Ho provato a include specs into the capabilities dictionary inside the helper itself, ma l'errore persiste.

Come risolvere l'errore e impostare il profilo firefox se si utilizza multiCapabilities?


Per aggirare il problema, ho creato un file di configurazione goniometro separato con solo firefox configurato (usando capabilities) e impostare grunt per eseguire goniometro due volte - uno per questo "firefox con un profilo" config e l'altro uno per tutti gli altri browser.

+2

Ho aperto un problema https://github.com/angular/protractor/issues/1594. Penso che sia quello che vuoi. Si prega di commentare questo problema e utilizzarlo per tenere traccia degli aggiornamenti. – hankduan

+1

@hankduan grazie mille per aver elaborato questa richiesta di funzionalità. Per favore, fai una risposta (con alcuni dettagli tecnici che hai fornito nel problema github) e accetterò. Nel caso in cui la funzionalità venga implementata, aggiorneremo la risposta con le istruzioni appropriate. – alecxe

risposta

6

In questo momento, il goniometro può accettare le promesse come capacità solo se NON stiamo utilizzando la multicomponibilità. Il motivo è che multiCapabilities esegue ogni attività in un nuovo processo, quindi la promessa (funzione) non può essere superata (le singole funzionalità funzionano perché non stiamo modificando).

In alternativa, è possibile risolvere le funzionalità nel programma di avvio, prima di trasferire le funzionalità risolte nei nuovi processi; tuttavia, ciò interromperà la possibilità di configurare i proxy (https://github.com/angular/protractor/pull/1040), che si basa sulla possibilità che le promesse vengano risolte dopo l'installazione di DriverProvider.

Non riesco a pensare a un modo semplice per farlo (senza un grande refactoring), ma è sicuramente fattibile. Ho creato un problema per Goniometro (https://github.com/angular/protractor/issues/1594). Per favore seguilo e/o commentalo se questo è qualcosa che ti serve o hai altre idee per implementarlo.

Per ora è necessario utilizzare la soluzione che hai citato nella tua domanda originale.

UPDATE

https://github.com/angular/protractor/pull/1629 supporta questo. A partire dal goniometro 1.6 (o se si esegue la sincronizzazione con il master) è possibile passare una funzione a config.getMultiCapabilities come onPrepare e onCleanup. Questa funzione può restituire una promessa a multiCapabilties (cioè matrice di capabilities).

Vedere https://github.com/angular/protractor/blob/master/spec/getCapabilitiesConf.js per un esempio.

+1

È incredibile, l'ho provato - funziona! (Ho aggiunto una risposta con un esempio di come ho configurato il goniometro usando 'getMultiCapabilities()') andando ad assegnarti una taglia aggiuntiva. Grazie ancora! – alecxe

2

A seguito della pull request inviato da @hankduan, ecco come ho ho usato getMultiCapabilities() di combinare capacità diverse, dove uno di loro è una promessa (necessaria per firefox-profile da impostare):

"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; 
    }, 

    ... 

}; 

Spero che questo aiuterebbe qualcuno in futuro.

+1

Grazie per l'esempio. (Una cosa: non hai bisogno del setTimeout) – hankduan

+1

@hankduan buon punto, aggiornato. Grazie. – alecxe

+0

@hankduan non è sicuro del perché, ma senza il goniometro 'setTimeout()' sta per uscire con il codice di errore 100 (non ci sono test falliti). Ecco un [traceback completo] (https://gist.github.com/alecxe/446f15c78434665766db). Con 'setTimeout()' nessun errore, funzionante. – alecxe

Problemi correlati