First of all, I\'ve already checked various post and blogs concerning that point and I still can\'t figure out how to make it correctly.
I have tried many different
The two console.log
s (steps 1 & 3)in your testFunc
, that are not wrapped in the promise, will fire immediately when you call the function. Which is proven by your output. Then your promise (which looks to be working great!), returns the step 2 log when the promise is resolved (but after the logs have already fired).
And thus, it looks like this is doing what you want? I.e. your beforeEach
does indeed look like it's firing the async function before hitting your first spec.
I think this will get the output you want:
describe('testAsync', function() {
beforeEach(function() {
console.log('beforeEach - step 1 ');
// `get` implicitly registers a promise with the control flow
browser.get("https://angularjs.org/");
console.log('beforeEach - step 2 '); // runs "before" get above returns!
testFunc().then(function() {
// use a then to explicitly chain a dependency off a promise
console.log('beforeEach - after testFunc - step 3');
})
protractor.promise.controlFlow().execute(function() {
console.log('beforeEach - after testFunc, via controlFlow - step 4');
});
console.log('beforeEach - end of beforeEach - everything registered, nothing done');
});
var testFunc = function(){
console.log("testFunc - step 1")
// return browser wait promise to caller
// `wait` also implicitly registers with the control flow
return browser.wait(function() {
return element(by.id('twitter-widget-1')).isPresent()
.then(function (isPresent) {
console.log("testFunc - step 2")
return true; // tell wait its done by resolving then promise->element promise->wait
});
});
}
it('test after BeforeEach', function() {
console.log("Last trace")
});
});