Search code examples
angularjsprotractortravis-cisaucelabs

'Angular could not be found' when integrating Travis/Sauce Labs


I'm working to get Travis CI to run Protractor tests using Sauce Labs. The tunneling works fine, and my Express server clearly starts and stays up at http://localhost:9000, but my Protractor tests quickly fail with the error Error: Angular could not be found on the page http://localhost:9000/ : retries looking for angular exceeded. All the suggestions on the Internet usually involve not using Angular 1.0 (using 1.3), extending time outs (doing that), or forcing Protractor to look at <html> for the ng-app directive (doing that). I'm out of ideas.

Relevant config:

protractor.conf.js

exports.config = {
sauceUser: process.env.SAUCE_USERNAME,
sauceKey: process.env.SAUCE_ACCESS_KEY,
baseUrl: 'http://localhost:9000',

specs: ['e2e/**/*.spec.js'],
framework: 'jasmine',
maxSessions: 1,
allScriptsTimeout: 30000,
rootElement: 'html',
multiCapabilities: [
    {'browserName': 'chrome'},
    {'browserName': 'firefox'},
    {'name': 'diplomacy'},
    {'tunnel-identifier': process.env.TRAVIS_JOB_NUMBER ? process.env.TRAVIS_JOB_NUMBER : null},
    {'build': process.env.TRAVIS_BUILD_NUMBER ? process.env.TRAVIS_BUILD_NUMBER : null}
],
jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 360000,
    includeStackTrace: true
}
}

main.spec.js

'use strict';

describe('Home page', function() {
    var page;

    beforeEach(function() {
        browser.get(browser.baseUrl);
    });

    it('should pass', function() {
         expect(true).toBe(true);
    });
});

Travis log

Go here for the complete log. The highlights:

Extracting Sauce Connect
Waiting for Sauce Connect readyfile
08 Mar 16:30:00 - Sauce Connect 4.3.6, build 1628 8a5c837
08 Mar 16:30:00 - Using CA certificate bundle /etc/ssl/certs/ca-certificates.crt.
08 Mar 16:30:00 - Starting up; pid 3519
08 Mar 16:30:00 - Command line arguments: sc-4.3.6-linux//bin/sc -i 42.1 -f sauce-connect-ready-21801 -l /home/travis/sauce-connect.log
08 Mar 16:30:00 - Using no proxy for connecting to Sauce Labs REST API.
08 Mar 16:30:00 - Resolving saucelabs.com to 162.222.73.28 took 17 ms.
08 Mar 16:30:01 - Started scproxy on port 37246.
08 Mar 16:30:01 - Please wait for 'you may start your tests' to start your tests.
08 Mar 16:30:01 - Starting secure remote tunnel VM...
08 Mar 16:30:11 - Secure remote tunnel VM provisioned.
08 Mar 16:30:11 - Tunnel ID: 3cc5fd5b59984957831d125617c7d4f6
08 Mar 16:30:11 - Secure remote tunnel VM is now: booting
08 Mar 16:30:14 - Secure remote tunnel VM is now: running
08 Mar 16:30:14 - Remote tunnel host is: maki76159.miso.saucelabs.com
08 Mar 16:30:14 - Using no proxy for connecting to tunnel VM.
08 Mar 16:30:14 - Resolving maki76159.miso.saucelabs.com to 162.222.76.159 took 48 ms.
08 Mar 16:30:14 - Starting Selenium listener...
08 Mar 16:30:14 - Establishing secure TLS connection to tunnel...
08 Mar 16:30:14 - Selenium listener started on port 4445.
08 Mar 16:30:16 - Sauce Connect is up, you may start your tests.
08 Mar 16:30:16 - Connection established.

[unit tests here...all passing!]

[chrome #1] PID: 3621
[chrome #1] Specs: /home/travis/build/spamguy/diplomacy/e2e/main/main.spec.js
[chrome #1] 
[chrome #1] Using SauceLabs selenium server at http://ondemand.saucelabs.com:80/wd/hub
[chrome #1] [31mF[0m
[chrome #1] 
[chrome #1] Failures:
[chrome #1] 
[chrome #1]   1) Home page should pass
[chrome #1]    Message:
[chrome #1]      [31mError: Angular could not be found on the page http://localhost:9000/ : retries looking for angular exceeded[0m
[chrome #1]    Stacktrace:
[chrome #1]      Error: Angular could not be found on the page http://localhost:9000/ : retries looking for angular exceeded
[chrome #1] ==== async task ====
[chrome #1] Protractor.get(http://localhost:9000/) - test for angular
[chrome #1]     at [object Object].<anonymous> (/home/travis/build/spamguy/diplomacy/e2e/main/main.spec.js:7:13)
[chrome #1] ==== async task ====
[chrome #1] Asynchronous test function: beforeEach()
[chrome #1] Error
[chrome #1]     at [object Object].<anonymous> (/home/travis/build/spamguy/diplomacy/e2e/main/main.spec.js:6:3)
[chrome #1]     at Object.<anonymous> (/home/travis/build/spamguy/diplomacy/e2e/main/main.spec.js:3:1)
[chrome #1] 
[chrome #1] Finished in 11.877 seconds
[chrome #1] [31m1 test, 2 assertions, 1 failure
[0m[chrome #1] 
[chrome #1] SauceLabs results available at http://saucelabs.com/jobs/c0eed61d95044f77b200a7b21d2443a3

[launcher] 1 instance(s) of WebDriver still running

[two more WebDriver instances fail with similar errors]


Solution

  • FWIW, I eventually got everything working correctly. There is no 'one fix' I made so I can't really clarify the solution easily. The following files are from my repository with which I set up continuous integration.

    protractor-travis.conf.js

    exports.config = {
        // sauce plz
        sauceUser: process.env.SAUCE_USERNAME,
        sauceKey: process.env.SAUCE_ACCESS_KEY,
        baseUrl: 'http://localhost',
    
        specs: ['e2e/**/*.po.js', 'e2e/**/*.spec.js'],
        framework: 'jasmine',
        maxSessions: 1,
        allScriptsTimeout: 40000,
        getPageTimeout: 40000,
        rootElement: 'html',
        multiCapabilities: [
            capabilitiesForBrowser('chrome', '41'),
            capabilitiesForBrowser('firefox'),
            capabilitiesForBrowser('safari')
        ],
        jasmineNodeOpts: {
            showColors: true,
            defaultTimeoutInterval: 360000,
            includeStackTrace: true
        }
    };
    
    function capabilitiesForBrowser(browserName, browserVersion) {
        var capabilities = {
            'browserName': browserName,
            'build': process.env.TRAVIS_BUILD_NUMBER,
            'name': 'dipl.io'
        };
        if (browserVersion)
            capabilities.version = browserVersion;
    
        return capabilities;
    }
    

    Gruntfile.js

    protractor: {
            travis: {
                options: {
                    configFile: 'protractor-travis.conf.js',
                    args: {
                        sauceUser: process.env.SAUCE_USERNAME,
                        sauceKey: process.env.SAUCE_ACCESS_KEY
                    }
                }
            },
            local: {
                options: {
                    configFile: 'protractor-local.conf.js'
                    //,debug: true
                }
            }
        }
    

    .travis.yml

    language: node_js
    node_js:
      - '0.12'
    services:
        - mongodb
    env:
      global:
        - secure: ioYHs4gjuL9iuwxamtKCkERvvSiBlAgxhLZ1Ry4xrZhNWe3e4pett3249hWovDYzG/eEHTA20/NDvZ1JIMYODFzY4gURVHNtUkoYNokLSDguTH1OPXGMmtQzJGersxYQOjRj3gSss7Z0joUrcfPQJsG1Vt0eHR/ewN7Qbm8NBn0=
        - secure: NH3WbHM2Ir95csdWAdd7/ISYVvnYFQe7Rv4rCoYu9V6V2M9AzlARYTAvBqoK7PdD/RV0KR41t6OVeUxBVhuzT26NvBVZVyLcvfjK29AoKCDCU7VD7nQa/RQ9KyDr5DAHfyQQ5AQMhsla5qPTaFZb82F83lL44nDzrvYzE8CEaGw=
    
    before_install:
        - npm install -g bower
        - bower install
        - sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules
        - git submodule update --init --recursive
        - npm install -g grunt-cli
    
    script:
        - grunt test:protractor-travis