12
votes

I'm trying to set up End-2-End testing for my Angular (1.4) site using protractor (2.1.0). Jasmine is installed and unit tests are working fine. When I run protractor the index#/login page loads in a browser window but no code runs and protractor reports this error

Failed: Angular could not be found on the page http://localhost/SpectrumGMWeb/index.html#/login : retries looking for angular exceeded

My protractor config looks like this

exports.config = {
    allScriptsTimeout: 11000,
    seleniumAddress: 'http://127.0.0.1:4444/wd/hub',
    specs: [
        '*.js'
    ],
    rootElement:'html',
    capabilities: {
        'browserName': 'chrome'
    },
    baseUrl: 'http://localhost/SpectrumGMWeb/',
    framework: 'jasmine2',
    jasmineNodeOpts: {
        defaultTimeoutInterval: 30000
    },
};

My test file is very simple

describe('my app', function() {

    describe('login', function() {

        beforeEach(function() {
            browser.get('index.html#/login');
        });

        it('should render login page when user navigates to login page', function() {
            expect(true).toBe(true);
        });

    });
});

ng-app="main" is set on the html element of index.html. The website does work.

Any ideas?

5
Just for the sake of testing and debugging, move ng-app to body and comment out rootElement in the config. Same error? Thanks. - alecxe
also tried... renaming root module, and manually bootstrapping angular - nuander
Do you have the correct login page url in the get method browser.get('index.html#/login')? Does the number sign # belong there? If it does then you might have some redirection to an intermediate non-angular page going on. - finspin
Try this: browser.driver.get('index.html#/login'); - Nagarjuna Reddy
I tried browser.get('index.html') but same problem. I tried browser.driver.get but then the browser through an error "Cannot navigate to invalid URL" - nuander

5 Answers

10
votes

Try putting a browser.ignoreSynchronization = true; before you do a browser.get() in your login function.

8
votes

If you need to navigate to a page which does not use Angular then Add this line of code before browser.get() line there:

browser.waitForAngularEnabled(false);

Reference : https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular-on-page-load

6
votes

Well thanks everyone for your input. I did finally fix this problem by copying all the index.html file contents to a new file. It seems that somehow the file was corrupted in a way that protractor did not like. I know it sounds simple but I wasted 2 full days on this so hope it helps someone.

1
votes

Are you sure you've launched your server at http://localhost/SpectrumGMWeb/?

Protractor is feeding this URL to Selenium and trying to access your application at this address. If it is not running at this address Protractor will get no response from it and will give you the error you are getting.

If you need advice on how to get a local server up and running to serve your project, I recommend grunt-connect, for example like this (which will launch a server at http://localhost:9001)

module.exports = function(grunt) {

    grunt.initConfig({
        connect: {
            server: {
                options: {
                    port: 9001,
                    base: '', // root folder of your app files
                     keepalive: true
                }
            }
        }
    });

    grunt.loadNpmTasks('grunt-contrib-connect');
    grunt.registerTask('default', ['connect:server'])
}
0
votes

I received this error as well, and I fixed it by changing my package.json "scripts" variable from:

"scripts": {
    ...
    "pree2e": "webdriver-manager update --standalone false --gecko false",
    "e2e": "protractor"
  }

to

"scripts": {
    ...
    // REMOVE "pree2e"
    "e2e": "ng e2e"
  }