9

Il problema:utilizzando le scorciatoie da tastiera cross-platform nei test end-to-end

Nel nostro piuttosto grande base di codice di test, stiamo usando diverse scorciatoie da tastiera. Per esempio, per copiare il testo selezionato stiamo usando CTRL/COMMAND + C, per incollare CTRL/COMMAND + v, per aprire una nuova scheda CTRL/COMMAND + T ecc

Per mantenere prove di lavoro su più piattaforme, vorremmo rendere il CTRL vs COMMAND scelta automatica a seconda su quale piattaforma è in esecuzione il browser di destinazione su. Per determinare una piattaforma di destinazione, stiamo attualmente utilizzando la seguente funzione di supporto che utilizza navigator.appVersion:

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

Il problema di questo approccio è che getControlKey() restituisce una promessa e, ogni volta che lo usiamo, dobbiamo risolvere la promessa esplicitamente:

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

The Question (s):

  1. E 'pos è possibile evitare la nidificazione e semplificare l'uso di getControlKey()? Idealmente mi piacerebbe farlo funzionare così semplice come:

    elm.sendKeys(protractor.Key.chord(helpers.getControlKey(), "c")); 
    
  2. Sta usando navigator.appVersion l'approccio migliore per determinare una piattaforma di destinazione, e c'è un modo migliore?

+0

Come il goniometro viene eseguito in Node.js env, penso che sia possibile utilizzare ['os.platform()'] (https://nodejs.org/api/os.html # os_os_platform), che è una chiamata sincrona (presupponendo che i test vengano eseguiti sulla stessa macchina con il browser). –

+1

@MichaelRadionov il problema è che non possiamo assumere che la macchina su cui vengono eseguiti i test sia la stessa macchina su cui è stato avviato il browser. Grazie. – alecxe

+1

Questa non è una soluzione pulita, ma si può semplicemente eseguire la ricerca 'navigator' in' onPrepare' una volta e definire una costante/aiuto lì. Ciò eviterebbe la necessità di far passare una promessa. –

risposta

4

Ecco il mio meglio per rispondere alla tua prima domanda, per i due scenari -

  • Se più tester eseguire gli script nella propria macchina, il metodo di supporto può essere collocato in onPrepare() funzione di assegnazione del valore a una variabile globale costante, che sarà disponibile per tutti i test.

  • Se tutti i test vengono eseguiti su una piattaforma distribuita in cui tutti i test sono assegnati casualmente a macchine diverse, in tal caso la scrittura del metodo di supporto assegnando il valore di una variabile locale costante per un test nel beforeAll() funzione sarà utile.

Trasferirsi tua seconda domanda, v'è anche un altro modo in cui possiamo ottenere la piattaforma su cui è in esecuzione la specifica prova utilizzando il metodo di goniometro getCapabilities().

codice per ottenere il tipo di piattaforma -

//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; 
}); 

Usage:

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

Speranza che aiuta.

+0

Ottima risposta. L'unica cosa che dovevo cambiare è 'Darwin' invece di' MAC'. Grazie ancora! – alecxe

Problemi correlati