Jasmine 规范超时。重置 WebDriver 控制流 - 当重定向到新页面时
A Jasmine spec timed out. Resetting the WebDriver Control Flow - when redirect to new page
我是端到端测试的新手,遇到了问题。
当我登录时 - 我从 login.php 重定向到 index.php 页面。
但是我的测试失败并出现以下错误:
..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
我的代码:
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');
});
所以问题是我如何等待我的页面重新加载并检查 url?
UPD
我发出 Ajax POST 请求,如果 login/pass 正确,我会重定向到 /index.php
UPD 2
我已经用 browser.wait (browser.driver.wait) 尝试了几种结构,但都没有成功:
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);
});
和
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();
});
这些都不起作用:( 但是 当我不使用 browser 或 element - 有效。例如:
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);
});
所以我猜这是在重定向后使用 browser 和 element 时的问题。
有什么想法吗?
您正在超时,因为您已将一个参数注入 it
回调并且从未调用它(阅读有关 here 的更多信息)。您应该删除参数,或在测试结束时调用它。基本上,您不执行任何自定义异步操作,因此您不需要它。
So the question is how I can wait when my page will reload and check url?
我建议您等待 index.php
页面上的特定元素:
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!');
});
好的,我已经自己解决了这个问题,但不知道为什么 element 和 browser 不起作用。
我变了
expect(element(by.css('body')).getText()).toContain('Welcome Test User');
到
expect(browser.driver.findElement(by.css('body')).getText()).toContain('Welcome Test User');
所以我将 element 更改为 browser.driver.findElement 一切正常。
我不知道为什么会这样,但它有效:)
UPD
据我了解,browser.driver.findElement - 不是 angular 方式,如果我们使用非 angular 页面,我们应该使用它。虽然我使用 angular,但 element 和 browser 似乎没有重新初始化。我在这里找到的一些信息
http://engineering.wingify.com/posts/angularapp-e2e-testing-with-protractor/#test-both-angularjs-and-non-angularjs-based-pages
Jasmine 对每个规范都有超时,即 jasmine 框架中的每个 it
。因此,如果任何规范 (it
) 超过 jasmine 规范的默认超时,那么它就会失败。
解决方法:
要为一个单独的规范覆盖 jasmine 规范超时,请将第三个参数传递给它:
it(description, testFn, timeout_in_millis)
it('description of test case', function() {
/*your test
steps
here*/
},120000);//120 seconds timeout for this spec
的更多信息
expect(element(by.cssContainingText('body', 'Hello, you are Logged In!')).isPresent()).toBeTruthy();
expect(element.all(by.cssContainingText('body', 'Hello, you are Logged In!')).get(2).isPresent()).toBeTruthy();
- 如果数组正文中的相同文本不止一次,则
jasmineNodeOpts: { defaultTimeoutInterval: 260000 }
对我来说,将其包含在 conf.js
中后即可使用
我是端到端测试的新手,遇到了问题。 当我登录时 - 我从 login.php 重定向到 index.php 页面。 但是我的测试失败并出现以下错误:
..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
我的代码:
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');
});
所以问题是我如何等待我的页面重新加载并检查 url?
UPD
我发出 Ajax POST 请求,如果 login/pass 正确,我会重定向到 /index.php
UPD 2
我已经用 browser.wait (browser.driver.wait) 尝试了几种结构,但都没有成功:
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);
});
和
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();
});
这些都不起作用:( 但是 当我不使用 browser 或 element - 有效。例如:
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);
});
所以我猜这是在重定向后使用 browser 和 element 时的问题。
有什么想法吗?
您正在超时,因为您已将一个参数注入 it
回调并且从未调用它(阅读有关 here 的更多信息)。您应该删除参数,或在测试结束时调用它。基本上,您不执行任何自定义异步操作,因此您不需要它。
So the question is how I can wait when my page will reload and check url?
我建议您等待 index.php
页面上的特定元素:
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!');
});
好的,我已经自己解决了这个问题,但不知道为什么 element 和 browser 不起作用。 我变了
expect(element(by.css('body')).getText()).toContain('Welcome Test User');
到
expect(browser.driver.findElement(by.css('body')).getText()).toContain('Welcome Test User');
所以我将 element 更改为 browser.driver.findElement 一切正常。
我不知道为什么会这样,但它有效:)
UPD
据我了解,browser.driver.findElement - 不是 angular 方式,如果我们使用非 angular 页面,我们应该使用它。虽然我使用 angular,但 element 和 browser 似乎没有重新初始化。我在这里找到的一些信息 http://engineering.wingify.com/posts/angularapp-e2e-testing-with-protractor/#test-both-angularjs-and-non-angularjs-based-pages
Jasmine 对每个规范都有超时,即 jasmine 框架中的每个 it
。因此,如果任何规范 (it
) 超过 jasmine 规范的默认超时,那么它就会失败。
解决方法:
要为一个单独的规范覆盖 jasmine 规范超时,请将第三个参数传递给它:
it(description, testFn, timeout_in_millis)
it('description of test case', function() {
/*your test
steps
here*/
},120000);//120 seconds timeout for this spec
的更多信息
expect(element(by.cssContainingText('body', 'Hello, you are Logged In!')).isPresent()).toBeTruthy();
expect(element.all(by.cssContainingText('body', 'Hello, you are Logged In!')).get(2).isPresent()).toBeTruthy();
- 如果数组正文中的相同文本不止一次,则
jasmineNodeOpts: { defaultTimeoutInterval: 260000 }
对我来说,将其包含在 conf.js
中后即可使用