角度从未提供resumeBootstrap

时间:2015-09-22 14:03:56

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

首先:我们已经找到了解决问题的方法:

  • 角度更新 - >我们使用最新版本的1.4
  • waitForAngular()
  • window.title
  • ...

但他们从来没有工作过。

致我们的设置:

我们正在开发版本号为1.4.x的AngularJS应用。 当我们尝试测试I18n集成时,错误出现在E2E测试中。 对于I18n,我们使用angular-translate。

exports.config =
    seleniumServerJar: "./node_modules/protractor/selenium/selenium-server-standalone-2.45.0.jar"
    chromeDriver: "./node_modules/protractor/selenium/chromedriver"
    capabilities:
        browserName: "chrome"
        name: "APP_NAME Selenium"
    troubleshoot: true
    framework: "jasmine2"
    rootElement: "body"
    onPrepare: ->
        global.By = global.by
        browser.manage().window().maximize()
    jasmineNodeOpts:
        showColors: true
        defaultTimeoutInterval: 30000
        isVerbose: true

奇怪的是,我们只在大约50%的时间内得到错误。有时测试通过而没有任何错误,然后我们有时间由于此错误至少有一次测试失败。

describe "The language", ->
    it "should be german with german URL", ->
        browser.get "/de/"
        expect( element( By.id("slogan") ).getText() ).toEqual "SLOGAN HERE!"

    it "should be preserved when a link is clicked", ->
        browser.get "/de/"
        element( By.css(".get-started a") ).click()
        expect( browser.getCurrentUrl() ).toEqual "http://localhost:3123/de/import"

        element( By.id("option-empty-table") ).click()
        expect( browser.getCurrentUrl() ).toEqual "http://localhost:3123/de/editor"

    it "should have the correct translations when a link is clicked", ->
        browser.get "/de/"

        element( By.css(".get-started a") ).click()
        expect( element( By.css("#option-empty-table a h3") ).getText() ).toEqual "SOME STRING"

我们开始与Gulp进行测试。这是gulp的任务:

gulp.task "e2e",
    "Runs all e2e tests.",
    [
        "run"
    ],
    ->
        gulp.src E2E_FILES
        .pipe protractor
            configFile: "./protractor.config.coffee"
            args: [
                "--baseUrl"
                BASEURL
            ]

BASEURL变量是" http://localhost:3123"

最后但并非最不重要的是"运行"来自gulp的任务:

gulp.task "run", "Serves the App.",
    [
        "build"
    ],
    ->
        browserSync.init
            server:
                baseDir: BUILD.dirs.out
                index: "/statics/master.html"
                middleware: [modRewrite(['!\\.\\w+$ /statics/master.html [L]'])]
            open: false
            port: 3123
            ui:
                port: 3124
                weinre: 3125
            logLevel: "info"
            notify: false
            logPrefix: "SOME_PREFIX"

有没有人有这么奇怪的行为?

提前致谢!

1 个答案:

答案 0 :(得分:3)

简答:

scrollRestoreTechnique: 'cookie'添加到您的browsersync配置。

答案很长:

Browsersync(> = 2.7.11)restores your scroll position刷新时将其存储在两个位置之一 - window.name(默认值)或Cookie中。

不幸的是,Protractor使用名为Deferred Bootstrap的Angular功能,该功能使用window.name并与BrowserSync冲突。来自AngularJS文档:

  

此功能使Batarang和测试运行器等工具能够挂接到角度的引导过程,并将更多模块潜入DI注册表,这可以替换或增加DI服务,以便进行检测或模拟重度依赖。

     

如果window.name包含前缀NG_DEFER_BOOTSTRAP!当调用angular.bootstrap时,引导过程将暂停,直到调用angular.resumeBootstrap()。

如果Browsersync在被Angular捕获之前覆盖了window.name值,Angular将不会推迟其Bootstrap,而Protractor随后将无法找到resumeBootstrap函数,因为它不存在。< / p>

告诉Browsersync使用cookie而不是window.name来解决冲突。