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 combinaison of :
- browser wait
- protractor.controlFlow().execute
- protractor.controlFlow().await(
...Still no success..
My problem
Within my beforeEach function, I'd like to call a protractor promise and wait for it to resolve before performing the rest of my code.
My Code
I've prepared this simple test for anyone willing to help me
describe('testAsync', function() {
beforeEach(function() {
console.log('beforeEach - step 1 ')
browser.get("https://angularjs.org/");
console.log('beforeEach - step 2 ')
testFunc()
console.log('beforeEach - after testFunc - step 3')
});
var testFunc = function(){
console.log("testFunc - step 1")
browser.wait(function() {
var deferred = protractor.promise.defer();
element(by.id('twitter-widget-1')).isPresent()
.then(function (isPresent) {
console.log("testFunc - step 2")
deferred.fulfill(isPresent);
});
return deferred.promise;
});
console.log("testFunc - step 3")
}
it('test after BeforeEach', function() {
console.log("Last trace")
});
});
Current Output
[launcher] Running 1 instances of WebDriver
beforeEach - step 1
beforeEach - step 2
testFunc - step 1
testFunc - step 3
beforeEach - after testFunc - step 3
testFunc - step 2
Last trace
Expected Output
[launcher] Running 1 instances of WebDriver
beforeEach - step 1
beforeEach - step 2
testFunc - step 1
testFunc - step 2 // <------ This is within the promise resolve
testFunc - step 3
beforeEach - after testFunc - step 3
Last trace
it
, which is what your question says you want to happen (the beforeEach happens before the it). If you want to make steps within the beforeEach dependent, you need to express that explicitly (via athen
or separate control flow registrations), that's just how JavaScript/WebDriver/Protractor work. – Cannularbrowser.wait
returns a promise. There is no need to construct a promise within and return it. – Chalice