2014-07-20 24 views
10

mam to:Czy istnieje sposób na rozwiązanie wielu obietnic za pomocą kątomierza?

element(by.id('x')).sendKeys('xxx').then(function(text) { 
    element(by.id('y')).sendKeys('yyy').then(function(text) { 
    element(by.id('z')).sendKeys('zzz').then(function(text) { 
     expect(element(by.id('myButton')).isEnabled()).toBe(true); 
    }) 
    }); 
}); 

Przycisk 'myButton' jest włączony, kiedy elementy 'X', 'Y' i 'Z' mają wartości. Rozumiem, że sendKeys zwraca obietnicę.

Czy to jedyny sposób, w jaki mogę sprawdzić, czy włączony jest "myButton", który zależy od danych we wszystkich trzech polach?

+1

Powinieneś chyba przyjąć odpowiedź Andresa, ponieważ to prawda. –

+0

całkowicie zmieniłem moją odpowiedź. znalazłem oficjalne wsparcie przez kątomierz. przejrzyj i zaakceptuj. –

Odpowiedz

12

Nie trzeba do łańcucha żadnych obietnic, ponieważ kątomierz będzie czekać, aż wszystkie instrukcje są wykonywane: https://github.com/angular/protractor/blob/master/docs/control-flow.md

element(by.id('x')).sendKeys('xxx'); 
element(by.id('y')).sendKeys('yyy'); 
element(by.id('z')).sendKeys('zzz'); 
expect(element(by.id('myButton')); 

Jeśli chcesz rozwiązać wiele obietnic użyć:

var webdriver = require('selenium-webdriver'); 
webdriver.promise.fullyResolved(promises); 

Na przykład : https://github.com/angular/protractor/blob/d15d35a82a5a2/lib/protractor.js#L327

9

to trochę po fakcie, ale:

var x = element(by.id('x')).sendKeys('xxx'); 
var y = element(by.id('y')).sendKeys('yyy'); 
var z = element(by.id('z')).sendKeys('zzz'); 

myFun(x,y,z).then(function(){ 
    expect(element(by.id('myButton')).isEnabled()).toBe(true); 
}); 


// in a common function library 
function myFun(Xel,Yel,Zel) { 
    return protractor.promise.all([Xel,Yel,Zel]).then(function(results){ 
    var xText = results[0]; 
    var yText = results[1]; 
    var zText = results[2]; 

    }); 
} 

ale jeszcze lepszy sposób:

var x = element(by.id('x')).sendKeys('xxx'); 
var y = element(by.id('y')).sendKeys('yyy'); 
var z = element(by.id('z')).sendKeys('zzz'); 

myFun(x,y,z); 
//isEnabled() is contained in the expect() function, so it'll wait for 
// myFun() promise to be fulfilled 
expect(element(by.id('myButton')).isEnabled()).toBe(true); 


// in a common function library 
function myFun(Xel,Yel,Zel) { 
    return protractor.promise.all([Xel,Yel,Zel]).then(function(results){ 
    var xText = results[0]; 
    var yText = results[1]; 
    var zText = results[2]; 

    }); 
} 

innym sposobem jest ŁAŃCUCH .thens razem:

element(by.id('x')).sendKeys('xxx'). 
    then(function(xtext){ 
    element(by.id('y')).sendKeys('yyy'); 

    }).then(function(ytext){ 
    element(by.id('z')).sendKeys('zzz'); 

    }).then(function(ztext){ 
    expect(element(by.id('myButton')).isEnabled()).toBe(true); 

    }); 
+0

Dobrze mi działało, dzięki! –

1

wydaje się, kątomierz obsługuje all - protractor.promise.all

czytaj więcej na stronie:

https://github.com/angular/protractor/issues/2062#issuecomment-94030055

describe('promise.all', function() { 
    it('should greet the named user', function() { 
    browser.get('http://juliemr.github.io/protractor-demo'); 

    $('div').click().then(function() { 
     return protractor.promise.all([ 
      $('h3').getText(), 
      $('h4').getText() 
     ]); 
    }).then(function (params) { 
     console.log('A'); 
    }); 
    }); 

    it('does something else', function() { 
    console.log('B'); 
    }); 

Jeśli chcesz zwrócić obiekt zamiast listy, wydaje można również zrobić - używane i to jest niesamowite

element.all(by.css('.fc-event-inner')).map(function(el) { 
    return { 
    time: el.findElement(by.className('fc-event-time')).getText(), 
    title: el.findElement(by.className('fc-event-title')).getText() 
    } 
}); 

Patrz właściwości są rzeczywiście obiecuje .. kątomierz rozwiąże im.

+0

dziękuję, naprawdę nie chciałeś używać requirejs tylko dla tej metody – jrhee17

+0

@ jrhee17 Jeśli chcesz zwrócić obiekt zamiast listy, możesz to łatwo zrobić: https://github.com/angular/protractor/issues/ 392 # issuecomment-33237672 –

Powiązane problemy