【问题标题】:protractor with deferred boostrapping具有延迟引导的量角器
【发布时间】:2016-03-01 17:20:34
【问题描述】:

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

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

这是我到目前为止所做的

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"

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

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

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

我还希望每次测试都运行这段代码(等待引导完成)。最好的组织方式是什么?

【问题讨论】:

    标签: javascript angularjs protractor


    【解决方案1】:

    我会尝试做的是关闭同步,直到满足预期条件

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

    我还希望每次测试都运行这段代码(等待引导完成)。最好的组织方式是什么?

    请看:

    【讨论】:

    • 你先生值得拥抱
    【解决方案2】:

    当您使用手动/半手动引导机制时,我不会使用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 块时一切都在运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多