I'm beginner in the e2e testing and have a problem. When I do login - I make redirect from login.php to index.php page. But my test is fails with following errors:
..A Jasmine spec timed out. Resetting the WebDriver Control Flow.
F
Failures:
1) Login Page should login and redirect to overview page with CR Operators rights.
Message:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
Stack:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
3 specs, 1 failure
My code:
it('should login and redirect to overview page with CR Operators rights', function(sync) {
element(by.model('username')).clear().sendKeys('testuser');
element(by.model('password')).clear().sendKeys('test');
element(by.css('[type="submit"]')).click();
expect(browser.getLocationAbsUrl()).toMatch('/overview');
});
So the question is how i can wait when my page will reload and check url?
UPD
I make an Ajax POST request and if login/pass are correct I do redirect to /index.php
UPD 2
I have tried several constructions with browser.wait (browser.driver.wait) but without any success:
it('should login and redirect to overview page with CR Operators rights', function(done) {
element(by.model('username')).clear().sendKeys('testuser');
element(by.model('password')).clear().sendKeys('test');
element(by.css('[type="submit"]')).click();
setTimeout(function() {
expect(element(by.css('body')).getText()).toContain('Welcome Test User');
done();
}, 1000);
});
and
it('should login and redirect to overview page with CR Operators rights', function(done) {
element(by.model('username')).clear().sendKeys('testuser');
element(by.model('password')).clear().sendKeys('test');
element(by.css('[type="submit"]')).click();
browser.driver.wait(function() {
return browser.driver.getCurrentUrl().then(function(url) {
console.log(url);
return (/overview/).test(url);
});
}, 5000);
expect(browser.getLocationAbsUrl()).toMatch('/overview');
done();
});
everything of these don't work :( BUT when I don't use browser or element - it works. E.g.:
it('should login and redirect to overview page with CR Operators rights', function(done) {
element(by.model('username')).clear().sendKeys('testuser');
element(by.model('password')).clear().sendKeys('test');
element(by.css('[type="submit"]')).click();
setTimeout(function() {
expect(true).toBe(true);
done();
}, 1000);
});
So I guess that here is a problem when use browser and element after redirect.
Any thoughts?
You are getting timeout because you've injected a param into it
callback and never called that (read more on that here). You should remove the param, or call it when the test is over. Basically, you don't do any custom async stuff, so you don't need it.
So the question is how I can wait when my page will reload and check url?
I'd suggest that you waited for a specific element on index.php
page:
it('should login and redirect to overview page with CR Operators rights', function() {
element(by.model('username')).clear().sendKeys('testuser');
element(by.model('password')).clear().sendKeys('test');
element(by.css('[type="submit"]')).click();
browser.wait(protractor.until.elementLocated(by.css('Log out'));
expect(element(by.css('body')).getText()).toContain('Hello, you are Logged In!');
});
Jasmine has timeout for each spec i.e. each it
in jasmine framework. so if any spec (it
) exceeds jasmine spec's default timeout then it fails that spec.
Solution:
To override jasmine spec timeout for one individual spec, pass a third parameter to it:
it(description, testFn, timeout_in_millis)
it('description of test case', function() {
/*your test
steps
here*/
},120000);//120 seconds timeout for this spec
more information on timeouts is here
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