javascript - Protractor 测试在本地通过,但在 Travis-CI 上未通过

标签 javascript angularjs protractor travis-ci angularjs-e2e

我最近使用 Protractor 将端到端测试添加到我的 AngularJS 应用程序中。我在本地运行了测试,它们都通过了,但是当我提交到 GitHub 和 Travis for CI 时,大多数测试都失败了。

我注意到失败的测试是那些需要路由到其他状态的测试(我使用的是 Angular UI Router)。

场景.js

describe('Test', function () {

    beforeEach(function () {
        browser.get('/');
    })

    it('should open the user page', function () {

        //browser.get("/");
        browser.sleep(3000);
        var button = element(by.id('createSession'));
        button.click().then(function () {
            browser.sleep(3000);
            expect(browser.getLocationAbsUrl()).toEqual("/user");
        });
    });

    it('should create a session and add a user', function () {

        //browser.get("/");
        browser.sleep(3000);
        var button = element(by.id('createSession'));
        button.click();
        browser.sleep(3000);
        var input = element(by.id('username'));
        input.sendKeys('Simona');
        var joinButton = element(by.id('joinSession'));
        joinButton.click();
        browser.sleep(3000);
        expect(element(by.id('addStart')).isPresent()).toBe(true);

    });

    it('should join an existing session', function () {

        //browser.get("/");
        browser.sleep(3000);
        var inputSession = element(by.id('sessionId'));
        inputSession.sendKeys('testing123');
        var joinSessionBtn = element(by.id('enterSession'));
        joinSessionBtn.click();
        browser.sleep(3000);
        var input = element(by.id('username'));
        input.sendKeys('Simona1');
        var joinButton = element(by.id('joinSession'));
        joinButton.click();
        browser.sleep(3000);
        expect(element(by.id('addStart')).isPresent()).toBe(true);

    });

    it('should add user to active users', function () {

        //browser.get("/");
        browser.sleep(3000);
        var inputSession = element(by.id('sessionId'));
        inputSession.sendKeys('testing123');
        var joinSessionBtn = element(by.id('enterSession'));
        joinSessionBtn.click();
        browser.sleep(3000);
        var input = element(by.id('username'));
        input.sendKeys('Simona');
        var joinButton = element(by.id('joinSession'));
        joinButton.click();
        browser.sleep(3000);
        var user = element(by.id('Simona'));
        expect(user.isPresent()).toBe(true);

    });

    it('should not join a non-existing session', function () {

        //browser.get("http://localhost:8000/");
        browser.sleep(3000);
        var inputSession = element(by.id('sessionId'));
        inputSession.sendKeys('simonovaSesija');
        var joinSessionBtn = element(by.id('enterSession'));
        joinSessionBtn.click();
        browser.sleep(3000);
        var warning = element(by.id('warningSession')).isDisplayed();
        expect(warning).toBe(true);

    });


    it('should add an anonymous user on empty username input', function () {

        //browser.get("http://localhost:8000/");
        browser.sleep(3000);
        var inputSession = element(by.id('sessionId'));
        inputSession.sendKeys('testing123');
        var joinSessionBtn = element(by.id('enterSession'));
        joinSessionBtn.click();
        browser.sleep(3000);
        var input = element(by.id('username'));
        input.sendKeys('');
        var joinButton = element(by.id('joinSession'));
        joinButton.click();
        browser.sleep(4000);
        var user = element(by.id('Anonymous'));
        expect(user.isPresent()).toBe(true);

    });

});

Protractor .conf.js

    exports.config = {

      allScriptsTimeout: 11000,

      specs: [
        "scenarios.js"
      ],

      capabilities: {
        "browserName": "chrome"
      },

      baseUrl: "http://localhost:8000/",

      framework: "jasmine",

      jasmineNodeOpts: {
        defaultTimeoutInterval: 30000
      }

    };

package.json

    {
      "name": "angular-seed",
      "private": false,
      "version": "0.0.0",
      "description": "A starter project for AngularJS",
      "repository": "https://github.com/angular/angular-seed",
      "license": "MIT",
      "devDependencies": {
        "bower": "^1.7.7",
        "http-server": "^0.9.0",
        "jasmine-core": "^2.4.1",
        "karma": "^0.13.22",
        "karma-chrome-launcher": "^0.2.3",
        "karma-firefox-launcher": "^0.1.7",
        "karma-jasmine": "^0.3.8",
        "karma-junit-reporter": "^0.4.1",
        "protractor": "^3.2.2"
      },
      "scripts": {
        "postinstall": "bower install",
        "prestart": "npm install",
        "start": "http-server -a localhost -p 8000 -c-1 ./app",
        "pretest": "npm install",
        "test": "karma start karma.conf.js",
        "test-single-run": "karma start karma.conf.js --single-run",
        "preupdate-webdriver": "npm install",
        "update-webdriver": "webdriver-manager update",
        "preprotractor": "npm run update-webdriver",
        "protractor": "protractor e2e-tests/protractor.conf.js",
        "update-index-async": "node -e \"var fs=require('fs'),indexFile='app/index-async.html',loaderFile='app/bower_components/angular-loader/angular-loader.min.js',loaderText=fs.readFileSync(loaderFile,'utf-8').split(/sourceMappingURL=angular-loader.min.js.map/).join('sourceMappingURL=bower_components/angular-loader/angular-loader.min.js.map'),indexText=fs.readFileSync(indexFile,'utf-8').split(/\\/\\/@@NG_LOADER_START@@[\\s\\S]*\\/\\/@@NG_LOADER_END@@/).join('//@@NG_LOADER_START@@\\n'+loaderText+'    //@@NG_LOADER_END@@');fs.writeFileSync(indexFile,indexText);\""
      },
      "dependencies": {
        "bower": "^1.7.9",
        "express": "^4.14.0"
      }

}

.travis.yml

language: node_js
node_js:
  - '4.4'

addons:
  firefox: "latest"

# blocklist
branches:
  except:
    - master

# safelist
branches:
  only:
    - dev

before_script:
  - export CHROME_BIN=chromium-browser
  - export DISPLAY=:99.0
  - sh -e /etc/init.d/xvfb start
  - npm start > /dev/null &
  - npm run update-webdriver
  - sleep 1 # give server time to start

script:
  - node_modules/.bin/karma start karma.conf.js --no-auto-watch --single-run --reporters=dots
  - node_modules/.bin/protractor e2e-tests/protractor.conf.js

如您所见,我正在使用 Angular-seed 的 Angular 模板。

对于为什么会发生这种情况有什么建议吗?

最佳答案

了解您遇到的错误类型是最有帮助的,但无论如何,您有几个明显的罪魁祸首......

  1. CI 正在 headless 运行(即通过 XVFB),而您的本地则不是。两者将有不同的时间问题。
  2. 您有很多 sleep ,这可能会导致您的测试在不同环境(例如 CI 与本地)中表现不同。这是 sleep 不好的原因之一。这也会让我相信您的应用程序不是 Angular 的?如果这是真的,那么最好自己处理任何 wait。如果这是真的,那么为什么所有的人都在 sleep ?

希望能有点帮助。

关于javascript - Protractor 测试在本地通过,但在 Travis-CI 上未通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38526062/

相关文章:

javascript - 如何定位子菜单元素(xpath、className 或 css 定位器)

javascript - 如何使我的正则表达式匹配集达到最小程度?

Javascript 函数生成器参数

javascript - Angular ( ionic )渲染复选框中的真实值

javascript - Protractor 中的异步等待被忽略

javascript - Angular Protractor executeScript/executeAsyncScript : Maximum call stack size exceeded

javascript - 使用 Javascript 检索 Google Analytics 跟踪器名称时出现问题

javascript - 延迟 Internet Explorer 注意到 location.hash 的更改

javascript - Angular Material md-input-container 占用空间大

javascript - Angular 绑定(bind)在任何标签内都不起作用