title: Running Protractor Test receive error "ReferenceError: modules is not defined"
body: <p>I'm trying to setup Protractor tests on a Windows machine. I have the server up and running but when I runt the tests, it fails and I get the following error:
  ReferenceError: modules is not defined"</p>
  
  <p>I'm using the <a href="https://code.google.com/p/selenium/wiki/PageObjects" rel="nofollow noreferrer">PageObject Pattern</a> to structure my tests &amp; testing framework.</p>
  
  <p>In my test file I have: </p>
  
  <pre><code>describe('Ticket', function(){
      var etPage = require('ticket-page.js');
  
      beforeEach(function () {
          etPage.get();
      });
  
      it('Should set Action', function(){
          browser.debugger();
          etPage.setTicketId(1);
      });
  };
  </code></pre>
  
  <p>And in the Ticket-page.js class</p>
  
  <pre><code>var EquityTicketPage = function () {
      this.ticketWrapper = null;
  
      this.setTicketId = function(id){
          this.ticketWrapper = driver.element(By.ByCssSelector('[data-ticket-id="' + id + '"]'));
      };
  
      this.get = function () {
          browser.ignoreSynchronization = true;
          browser.get('http://deleted');
      };
  };
  
  modules.exports = new EquityTicketPage();
  </code></pre>
  
  <p>The stack trace points to "modules.exports = new EquityTicketPage();" in the tickets-page.js file.  I'm not sure what its failing on this line. Maybe node isn't setup/referenced properly for these files.  Maybe its not setup properly on my machine.</p>
  
  <p>I saw this <a href="https://stackoverflow.com/questions/20837584/grunt-karma-test-runner-fails-with-referenceerror-module-is-not-defined">question</a> and thought maybe there's something wrong with a configuration. I don't have a grunt-karma version in my node_modules folder, and I don't know if I need it.  </p>
  
  <p>Then looking at this <a href="https://stackoverflow.com/questions/22935813/e2e-testing-angular-with-karma-ng-scenario-module-is-not-defined">question</a> I thought maybe I need something in my config file and noticed that I don't have a files section. The files section point to code files so I should be ok.  </p>
  
  <p>Here is my config</p>
  
  <pre><code>// A reference configuration file.
  exports.config = {
      // ----- How to setup Selenium -----
      //
      // There are three ways to specify how to use Selenium. Specify one of the
      // following:
      //
      // 1. seleniumServerJar - to start Selenium Standalone locally.
      // 2. seleniumAddress - to connect to a Selenium server which is already
      //    running.
      // 3. sauceUser/sauceKey - to use remote Selenium servers via SauceLabs.
      //
      // If the chromeOnly option is specified, no Selenium server will be started,
      // and chromeDriver will be used directly (from the location specified in
      // chromeDriver)
  
      // The location of the selenium standalone server .jar file, relative
      // to the location of this config. If no other method of starting selenium
      // is found, this will default to
      // node_modules/protractor/selenium/selenium-server...
      seleniumServerJar: null,
      // The port to start the selenium server on, or null if the server should
      // find its own unused port.
      seleniumPort: null,
      // Chromedriver location is used to help the selenium` standalone server
      // find chromedriver. This will be passed to the selenium jar as
      // the system property webdriver.chrome.driver. If null, selenium will
      // attempt to find chromedriver using PATH.
      chromeDriver: null,
      // If true, only chromedriver will be started, not a standalone selenium.
      // Tests for browsers other than chrome will not run.
      chromeOnly: false,
      // Additional command line options to pass to selenium. For example,
      // if you need to change the browser timeout, use
      // seleniumArgs: ['-browserTimeout=60'],
      seleniumArgs: [
      ],
  
      // If sauceUser and sauceKey are specified, seleniumServerJar will be ignored.
      // The tests will be run remotely using SauceLabs.
      sauceUser: null,
      sauceKey: null,
  
      // The address of a running selenium server. If specified, Protractor will
      // connect to an already running instance of selenium. This usually looks like
      // seleniumAddress: 'http://localhost:4444/wd/hub'
      seleniumAddress: 'http://localhost:4444/wd/hub',
  
      // The timeout for each script run on the browser. This should be longer
      // than the maximum time your application needs to stabilize between tasks.
      allScriptsTimeout: 11000,
  
      // ----- What tests to run -----
      //
      // Spec patterns are relative to the location of this config.
      specs: [
         'e2e/**/*behaviors-e2e.js'
          //'e2e/**/new-tickets-loading-e2e.js'
      ],
  
      // Patterns to exclude.
      exclude: [],
  
      //needs newer version
      suites: {
          all: ['e2e/**/*e2e.js'],
          fillDown: ['e2e/**/*e2e.js']
      },
  
      // ----- Capabilities to be passed to the webdriver instance ----
      //
      // For a full list of available capabilities, see
      // https://code.google.com/p/selenium/wiki/DesiredCapabilities
      // and
      // https://code.google.com/p/selenium/source/browse/javascript/webdriver/capabilities.js
      capabilities: {
          browserName: "internet explorer"
          //browserName: "phantomjs"
      },
  
  
      // ----- More information for your tests ----
      //
      // A base URL for your application under test. Calls to protractor.get()
      // with relative paths will be prepended with this.
      //baseUrl: 'http://nyqmoe3.ms.com:6060/vikas/#?sessionId=3c94bba7-4a7d-4443-b779-3909c3f90b4d',
  
      // Selector for the element housing the angular app - this defaults to
      // body, but is necessary if ng-app is on a descendant of &lt;body&gt;
      rootElement: 'html',
  
      // A callback function called once protractor is ready and available, and
      // before the specs are executed
      // You can specify a file containing code to run by setting onPrepare to
      // the filename string.
      onPrepare: function() {
          // At this point, global 'protractor' object will be set up, and jasmine
          // will be available. For example, you can add a Jasmine reporter with:
          //     jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter(
          //         'outputdir/', true, true));
      },
  
      // The params object will be passed directly to the protractor instance,
      // and can be accessed from your test. It is an arbitrary object and can
      // contain anything you may need in your test.
      // This can be changed via the command line as:
      //   --params.login.user 'Joe'
      params: {
          login: {
              user: 'Jane',
              password: '1234'
          }
      },
  
      // ----- The test framework -----
      //
      // Jasmine is fully supported as a test and assertion framework.
      // Mocha has limited beta support. You will need to include your own
      // assertion framework if working with mocha.
      framework: 'jasmine',
  
      // ----- Options to be passed to minijasminenode -----
      //
      // See the full list at https://github.com/juliemr/minijasminenode
      jasmineNodeOpts: {
          // onComplete will be called just before the driver quits.
          onComplete: null,
          // If true, display spec names.
          isVerbose: false,
          // If true, print colors to the terminal.
          showColors: true,
          // If true, include stack traces in failures.
          includeStackTrace: true,
          // Default time to wait in ms before a test fails.
          defaultTimeoutInterval: 30000
      },
  
      // ----- Options to be passed to mocha -----
      //
      // See the full list at http://visionmedia.github.io/mocha/
      mochaOpts: {
          ui: 'bdd',
          reporter: 'list'
      },
  
      // ----- The cleanup step -----
      //
      // A callback function called once the tests have finished running and
      // the webdriver instance has been shut down. It is passed the exit code
      // (0 if the tests passed or 1 if not).
      onCleanUp: function() {}
  };
  </code></pre>