9

Das Problem:Verwendung plattformübergreifende Tastaturkürzel in End-to-End-Tests

In unserer ziemlich großen Test Code-Basis, verwenden wir verschiedene Tastenkombinationen. Zum Beispiel ausgewählten Text kopieren wir CTRL/COMMAND + C, verwenden CTRL/COMMAND + v einfügen, um einen neuen Tab zu öffnen CTRL/COMMAND + T usw.

Tests zu halten auf mehreren Plattformen arbeiten, wir möchten, dass die CTRL vs COMMAND Wahl automatischen machen abhängig Auf welcher Plattform läuft der Zielbrowser unter. Um eine Zielplattform zu bestimmen, werden wir zur Zeit mit der folgenden Hilfsfunktion, die verwendet navigator.appVersion:

this.getControlKey = function() { 
    return browser.executeScript("return navigator.appVersion.indexOf('Mac');").then(function (isMac) { 
     return isMac ? protractor.Key.COMMAND : protractor.Key.CONTROL; 
    }); 
}; 

Das Problem bei diesem Ansatz ist, dass getControlKey() gibt ein Versprechen, und jedes Mal, wenn wir es verwenden, haben wir das Versprechen lösen ausdrücklich:

helpers.getControlKey().then(function (controlKey) { 
    elm.sendKeys(protractor.Key.chord(controlKey, "c")); 
}); 

Die Frage (n):

  1. Ist es po um die Verschachtelung zu vermeiden und die Verwendung von getControlKey() zu vereinfachen? Idealerweise würde ich es so einfach wie gerne arbeiten:

    elm.sendKeys(protractor.Key.chord(helpers.getControlKey(), "c")); 
    
  2. Nutzen navigator.appVersion der beste Ansatz eine Zielplattform zu bestimmen, und gibt es einen besseren Weg?

+0

Da der Winkelmesser in Node.js env läuft denke ich, dass Sie ['os.platform()'] (https://nodejs.org/api/os.html # os_os_platform), was ein synchroner Aufruf ist (vorausgesetzt, dass Tests auf demselben Rechner mit dem Browser ausgeführt werden). –

+1

@MichaelRadionov das Problem ist, können wir nicht davon ausgehen, dass die Maschine, auf der die Tests ausgeführt werden, dieselbe Maschine ist, auf der der Browser gestartet wird. Vielen Dank. – alecxe

+1

Dies ist keine saubere Lösung, aber Sie könnten einfach Ihre 'Navigator'-Suche in' onPrepare' durchführen und dort eine Konstante/Helfer definieren. Das würde die Notwendigkeit vermeiden, ein Versprechen zu bestehen. –

Antwort

4

Hier ist meine beste Ihre erste Frage zu beantworten, für die beiden Szenarien -

  • Wenn mehrere Tester die Skripte in der eigenen Maschine laufen, kann die Hilfsmethode in onPrepare() Funktion die Zuordnung gesetzt werden Wert für eine konstante globale Variable, die für alle Tests verfügbar ist.

  • Wenn alle Tests auf einer verteilten Plattform ausgeführt werden, auf der alle Tests zufällig unterschiedlichen Maschinen zugewiesen sind, ist in diesem Fall das Schreiben der Hilfsmethode hilfreich, die den Wert einer konstanten lokalen Variablen für diesen Test in zuweist.

zu Ihrer zweiten Frage bewegen, gibt es auch eine andere Möglichkeit, wo wir die Plattform bekommen, auf dem die Testspezifikation ausgeführt wird unter Verwendung des Winkelmesser getCapabilities() Methode.

-Code für den Plattformtyp bekommen -

//Below code can be placed either in `onPrepare()` function or `beforeAll()` function depending the need. 
//If the below code is placed in the `beforeAll()` function then i guess there won't be any need for a global variable. 

browser.controlKey = protractor.Key.CONTROL; //browser.controlKey is a global variable and can be accessed anywhere in the test specs 
browser.getCapabilities().then(function(capabilities){ 
    if(capabilities.caps_.platform === "MAC") 
     browser.controlKey = protractor.Key.COMMAND; 
}); 

Verbrauch:

elm.sendKeys(protractor.Key.chord(browser.controlKey, "c")); //if its stored as global variable 

Hoffe, es hilft.

+0

Große Antwort. Das einzige, was ich ändern musste, ist "Darwin" anstatt "MAC". Danke noch einmal! – alecxe