2017-02-08 5 views
1

Я хотел бы сделать что-то вроде этого, но это не работает, потому что isPresent возвращает обещание, а не логическое ...Как создать функцию isVisible в JS с помощью Protractor?

this.isVisible = function(){ 
    return browser.isElementPresent(_this.username) && 
     browser.isElementPresent(_this.password) && 
     browser.isElementPresent(_this.submit) 
} 

Я также попытался

this.isVisible = function(){ 
    return _this.username.isPresent() && 
     _this.password.isPresent() && 
     _this.submit.isPresent() 
} 

Есть ли способ справиться с этим? Возможно, использовать все, а затем объединить его с одним логическим обещанием или чем-то еще?

ответ

1

Вы можете использовать protractor.promise.all():

this.isVisible = function() { 
    return protractor.promise.all([ 
     browser.isElementPresent(_this.username), 
     browser.isElementPresent(_this.password), 
     browser.isElementPresent(_this.submit) 
    ]).then(function (isPresent) { 
     return isPresent[0] && isPresent[1] && isPresent[2]; 
    }); 
} 

И, если бы вы добавить helper spread() function:

function spread (callback) { 
    // and returns a new function which will be used by `then()` 
    return function (array) { 
     // with a result of calling callback via apply to spread array values 
     return callback.apply(null, array); 
    }; 
}; 

Это позволит сделать вещи немного более четко:

this.isVisible = function() { 
    return protractor.promise.all([ 
     browser.isElementPresent(_this.username), 
     browser.isElementPresent(_this.password), 
     browser.isElementPresent(_this.submit) 
    ]).then(spread(function (isUsernamePresent, isPasswordPresent, isSubmitPresent) { 
     return isUsernamePresent && isPasswordPresent && isSubmitPresent; 
    })); 
} 
+0

Прохладный и это просто вернет обещание с одним логическим правилом – Jackie

+1

@Ja ckie yup, я также добавил немного более читаемую версию, проверьте ее. Благодарю. – alecxe