茉莉花规格超时了。重置WebDriver控制流 - 重定向到新页面

时间:2015-06-11 17:42:17

标签: javascript angularjs protractor angularjs-e2e e2e-testing

我在e2e测试中遇到了问题并且有问题。 当我登录时 - 我从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');
});

所以问题是我的页面何时会重新加载并检查网址?

UPD

我发出Ajax POST请求,如果登录/传递正确,我会重定向到/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();
});

这些不能正常工作:( 当我不使用浏览器元素时 - 它有效。例如:

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);
});

所以我想在重定向后使用浏览器元素时出现问题。

有什么想法吗?

5 个答案:

答案 0 :(得分:9)

好的,我已经自己解决了这个问题,但不确定为什么元素浏览器无法正常工作。 我改变了

expect(element(by.css('body')).getText()).toContain('Welcome Test User');

expect(browser.driver.findElement(by.css('body')).getText()).toContain('Welcome Test User');

所以我已将元素更改为 browser.driver.findElement ,一切正常。

我不知道它为什么会发生,但它有效:)

<强> UPD

据我所知, browser.driver.findElement - 不是角度方式,如果我们使用非角度页面,我们应该使用它。虽然我使用angular,但似乎元素浏览器没有重新初始化。我在这里找到的一些信息 http://engineering.wingify.com/posts/angularapp-e2e-testing-with-protractor/#test-both-angularjs-and-non-angularjs-based-pages

答案 1 :(得分:4)

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

有关timeouts is here

的更多信息

答案 2 :(得分:1)

你正在超时,因为你已经在it回调中注入了一个参数并且从未调用过(请在here上阅读更多内容)。您应该删除该参数,或在测试结束时调用它。基本上,你不做任何自定义异步的东西,所以你不需要它。

  

所以问题是我的页面何时会重新加载并检查网址?

我建议您在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!');
});

答案 3 :(得分:1)

 jasmineNodeOpts: { defaultTimeoutInterval: 260000 } 

对我来说,将其包含在conf.js中之后

答案 4 :(得分:0)

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();
  • 如果您在阵列中的正文中有多次相同的文字,那么