Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

creating and resolving promises in protractor

Tags:

I am writing a test case for adding store information in the page for Angular app using Protractor, where initially I am counting the number of stores I already have and after the test block is done I expect the count to increase by one so for that I am doing this by following this link of creating promises How to create and manipulate promises in Protractor?

describe('myApp', function() {   var items,startCount;    var testPromise = function(){     items = element.all(by.repeater('store in storelist'));     var deferred = protractor.promise.defer();     items.count().then(function(orgCount){        startCount = orgCount;        console.log('Start Count: '+ startCount); //prints correct value e.g, 6     }, function(error){        console.log(error);     });     return deferred.promise;   };  it('should accept valid data for adding new store', function() {    var cNum = null;    testPromise().then(function(result){       cNum = result;       console.log('cNUm value: '+ cNum); //this value doesn't get printed in console    });    /* Code for adding test fields in store page */     expect(items.count()).toBe(cNum+1);  }); }); 

I expect the store count to be same at the end of the test. count() is resolving a promise and correct value of store count gets printed in testPromise() but in it block when I call testPromise().then method it never goes in that 'then' block

and the end result says

Message:  Expected 6 to be 1.  Stacktrace:   Error: Failed expectation 

I also researched a bit more in webdriver.promise.Promise() from this link http://selenium.googlecode.com/git/docs/api/javascript/class_webdriver_promise_Promise.html and tried using that for creating a promise and resolving its value but not sure what the problem is. Either I get error message saying 'expected 6 to be NaN' or 'expected 6 to be 1' Am I not resolving a promise or writing 'then' block correctly? Would appreciate some insights/help on this issue.

like image 602
DesaiM Avatar asked Jun 18 '14 15:06

DesaiM


People also ask

What is the use of then function in protractor?

Protractor can automatically execute the next step in your test the moment the webpage finishes pending tasks, so you don't have to worry about waiting for your test and webpage to sync.

What is resolve in promise angular?

resolve() The Promise. resolve() method "resolves" a given value to a Promise . If the value is a promise, that promise is returned; if the value is a thenable, Promise. resolve() will call the then() method with two callbacks it prepared; otherwise the returned promise will be fulfilled with the value.

What is control flow in protractor?

Protractor/WebDriverJS has this mechanism called Control Flow - it is an internal queue of promises, it keeps the code execution organized.


1 Answers

Creation

For creating a promise in protractor, you have to write:

var deferred = protractor.promise.defer(); var promise = deferred.promise; 

Callbacks

The callbacks are invoked asynchronously. You can register one (or more) "on success" callbacks:

promise.then(function() {    ... }); 

you can also register one (or more) "on error" callback:

promise.then(null, function() {    ... }); 

These registrations could be chained:

promise.then(function() {    ... }).then(function() {    ... }).then(null, function() {    ... }).then(function() {  }, function() {    ... }).then(onSuccess, onFailure); 

Resolution

Success

The "on success" callbacks are invoked when the promise is resolved successfully:

deferred.fulfill(value); 

Failure

The "on failure" callbacks are invoked when the promise is resolved successfully:

deferred.reject(new Error('a problem occurs')); 

In your code

you missed the resolution step. You have to fulfill the promise.

A more complete reference is available in the Webdriver.js documentation

like image 193
gontard Avatar answered Oct 23 '22 12:10

gontard