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.
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.
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.
Protractor/WebDriverJS has this mechanism called Control Flow - it is an internal queue of promises, it keeps the code execution organized.
For creating a promise in protractor, you have to write:
var deferred = protractor.promise.defer(); var promise = deferred.promise;
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);
The "on success" callbacks are invoked when the promise is resolved successfully:
deferred.fulfill(value);
The "on failure" callbacks are invoked when the promise is resolved successfully:
deferred.reject(new Error('a problem occurs'));
you missed the resolution step. You have to fulfill the promise.
A more complete reference is available in the Webdriver.js documentation
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With