具有延迟增强的量角器

时间:2016-03-01 17:20:34

标签: javascript angularjs protractor

我正在尝试为我们的角度应用程序设置端到端测试,但遇到了一些障碍。

一个是自举。我们正在使用这个库:angular-deferred-bootstrap来引导我们的应用程序。这个库允许我们进行http调用,然后将结果注入我们的应用程序(作为角度value())。然后它调用bootstrap函数实际用角度引导应用程序。我希望测试在这个boostrapping完成后运行。

这是我到目前为止所做的事情

describe('navigation should', function () {
    beforeEach(function () {
        // load homepage
        browser.get('/');
    }, 10000);

    it('show side navigation', function () {
        browser.wait(function () {
            var deferred = protractor.promise.defer();

            element(by.css('body.deferred-bootstrap-loading')).isPresent()
                .then(function (isPresent) {
                    deferred.fulfill(!isPresent);
                });

            return deferred.promise;
        });
    });
});

图书馆方便地在deferred-bootstrap-loading上放置body课程。我等到这个被删除了。

问题有时我得到错误Error while waiting for Protractor to sync with the page: "[ng:test] no injector found for element argument to getTestability\nhttp://errors.angularjs.org/1.4.8/ng/test"

它似乎比它(测试)传递更频繁地产生这个错误。

我不明白这里的问题是什么?量角器在角度运行之前是否有机会运行?

我是否必须在回调中运行所有测试,因为browser.wait会返回一个承诺?

此外,我希望此代码可以在每次测试时运行(等待bootstrapping完成)。组织这个的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

我要做的是关闭同步,直到达到预期的条件

beforeEach(function () {
    var EC = protractor.ExpectedConditions;

    browser.ignoreSynchronization = true;
    browser.get('/');

    // wait for deferred bootstrap body to not be present
    var body = $("body.deferred-bootstrap-loading");
    browser.wait(EC.stalenessOf(body), 10000).then(function () {
        browser.ignoreSynchronization = false;
    });
    browser.waitForAngular();  // might not be needed
});
  

此外,我希望此代码可以在每次测试时运行(等待bootstrapping完成)。组织这个的最佳方法是什么?

请参阅:

答案 1 :(得分:0)

当您使用手动/半手动引导机制时,我不会使用browser.get(),因为它等待加载Angular。而是使用browser.driver.get()并在之后的deferred-bootstrap-loading课程中添加等待。请参阅Angular的Setting Up the System Under Test

所以类似下面的内容应该可以解决问题:

describe('navigation should', function () {
    beforeEach(function (done) {
        // load homepage
        browser.driver.get('/');
        browser.driver.wait(function () {
            return browser.driver.isElementPresent(by.class('body.deferred-bootstrap-loading'))
                .then(function (el) {
                    return el === false;
                });
        }).then(done);
    }, 10000);

    it('show side navigation', function () {
        // normal test here
    });
});

我还没有测试过上面的内容,但是你应该了解一下。 通过使beforeEach异步并等待类从body标记中消失,您可以预期在运行it块时所有内容都会运行。