有没有办法用Protractor解决多个承诺?

Ala*_*an2 13 protractor

我有这个:

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);
     })
  });
});
Run Code Online (Sandbox Code Playgroud)

当元素'x','y'和'z'都具有值时,启用按钮'myButton'.我的理解是sendKeys返回一个承诺.

那么这是我能够检查是否启用了依赖于所有三个字段中的数据的'myButton'的唯一方法吗?

And*_*s D 14

您不需要链接任何承诺,因为量角器将等到所有语句完成: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'));
Run Code Online (Sandbox Code Playgroud)

如果要解决多个承诺,请使用:

var webdriver = require('selenium-webdriver');
webdriver.promise.fullyResolved(promises);
Run Code Online (Sandbox Code Playgroud)

例如:https://github.com/angular/protractor/blob/d15d35a82a5a2/lib/protractor.js#L327


Zac*_*ick 12

这有点事后,但是:

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];

  });
}
Run Code Online (Sandbox Code Playgroud)

但是更好的方法:

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];

  });
}
Run Code Online (Sandbox Code Playgroud)

另一种方式是将.thens链接在一起:

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

  });
Run Code Online (Sandbox Code Playgroud)