2015-07-25 15 views
5

sto provando a testare un'applicazione che visualizza grafici usando risciò e d3. i test sono implementati utilizzando goniometro e gelsomino. come nota a margine, credo che la domanda non sia propriamente specifica di questo caso d'uso ed è più generica.ottieni array di valori diversi dello stesso elemento usando il rapportatore

quindi, il test dovrebbe posizionare il mouse su un grafico e raccogliere il testo visualizzato per ciascun punto (example). questo array deve quindi essere confrontato con un determinato array.

Spero che questo pseudocodice illustra il problema:

var graph = ... // 
var promises = []; 
var promise = graphElement.getSize().then(function(size){ 
    _.times(size, function(i) { 
     moveMouse(i, 0); // move mouse to i-th pixel 
     promises.push(graph.element(by.css('.hover-text')).getText()); 
    }); 
    return promises; 
}); 

promise.magicallyWaitForAllOfThem(); 

_.each(promises, function(textPromise){ 
    expect(textPromise).toBe('something'); 
}); 

così, il problema è che da quando ho bisogno la dimensione di risolvere prima, io non ho un modo per attendere che tutte le promesse per risolvere e ritorno una serie di promesse di testo che possono essere successivamente utilizzate con expect().

MODIFICA: goniometro/gelsomino esplicitamente citato.

risposta

3

non puoi semplicemente utilizzare il selettore del selenio promise.all? modo

var graph = ... // 
var webdriver = require("selenium-webdriver"); 

graphElement.getSize().then(function(size){ 
    var promises = []; 
    _.times(size, function(i) { 
     moveMouse(i, 0); // move mouse to i-th pixel 
     promises.push(graph.element(by.css('.hover-text')).getText()); 
    }); 
    return webdriver.promise.all(promises); 
}).then(function(promiseResultArray){ 
    _.each(promiseResultArray, function(textPromise){ 
     expect(textPromise).toBe('something'); 
    }); 
}); 

più pulito:

dichiarano che:

collectHoverText: function(elem) { 
    var strings = []; 
    var promises = []; 

    return elem.getSize().then(function(size) { 
    _.times(0/*logic for number of steps*/, function(i) { 
     var x = 0; // logic for step 
     browser.actions().mouseMove(elem, {x: x, y: 0}).perform(); 
     promises.push(elem.element(by.css('.hover-text')).getText().then(function(text) { 
     strings.push(text); 
     })); 
    }); 

    return protractor.promise.all(promises).then(function() { 
     return _.uniq(strings); 
    }); 
    }); 

e usarlo:

var hoverTextPromise = collectHoverText(graph); 
expect(hoverTextPromise).toContain('value'); // resolved array here 
+0

è diverso da protractor.promise.all? – ilj

+0

può essere raggiunto senza la richiamata? – ilj

+0

vuoi dire senza 'then'? stai facendo una chiamata asincrona, hai bisogno di una callback – mido