First, please read Jasmine's official upgrade documentation.html
Specify that you want to use jasmine2.x:java
exports.config = { // Specify you want to use jasmine 2.x as you would with mocha. Note, 'jasmine' by default will use the latest jasmine framework. framework: 'jasmine'};
Similar to jasmine 1.3, you may include jasmineNodeOpts
in the config file. However, because we changed the runner from "https://github.com/juliemr/minijasminenode" to "https://github.com/jasmine/jasmine-npm", the options have changed slightly. In particular, we will only support the options in the official "jasmine-npm":node
jasmineNodeOpts: { // If true, print colors to the terminal. showColors: true, // Default time to wait in ms before a test fails. defaultTimeoutInterval: 30000, // Function called to print jasmine results. print: function() {}, // If set, only execute specs whose names match the pattern, which is // internally compiled to a RegExp. grep: 'pattern', // Inverts 'grep' matches invertGrep: false}
Notably options print
and grep
are new, but we will no longer support options isVerbose
and includeStackTrace
(unless, of course, "jasmine-npm" introduces these options).android
Instead of iit
, please use fit
. Instead of ddescribe
, please use fdescribe
.ios
Having a custom timeout for an it
block as a third parameter is not currently supported in Jasmine2, but it will be supported in a release soon. See this issue.git
See http://jasmine.github.io/2.0/upgrading.html#section-Custom_Matchersgithub
Before:web
toHaveText: function(expectedText) { return this.actual.getText().then(function(actualText) { return expectedText === actualText; });}
Now:spring
toHaveText: function() { return { compare: function(actual, expectedText) { return { pass: actual.getText().then(function(actualText) { return actualText === expectedText; }) }; } };}
Note: minijasminenode
provided asynchronous support for jasmine1.3 before (i.e. via done callback). Jasmine 2.x now provides the support natively, but the change is mostly transparent to protractor users who are upgrading from jasmine1.3.chrome
You can still pass in the done parameter as part of your asynchronous spec, but the syntax for failing it has changed.
Before:
it('async spec', function(done) { setTimeout(function() { if (passed) { done(); // When done } else { done('failure message'); // To fail spec } }, 5000);});
Now:
it('async spec', function(done) { setTimeout(function() { if (passed) { done(); // When done } else { done.fail('failure message'); // To fail spec } }, 5000);});
The syntax for custom reporters has changed for Jasmine2. If you were previously adding reporters from a node module, such as the jasmine-reporters
package on npm, make sure you upgrade to a version which supports Jasmine2. If you are writing your own reporter, see the Jasmine docs on custom reporters.
There are many options for using WebDriver to test on mobile browsers. Protractor does not yet officially support or run its own tests against a particular configuration, but the following are some notes on various setup options.
Setting Up Protractor with Appium - Android/Chrome
Install Java SDK (>1.6) and configure JAVA_HOME (Important: make sure it's not pointing to JRE).
Follow http://spring.io/guides/gs/android/ to install and set up Android developer environment. Do not set up Android Virtual Device as instructed here.
From commandline, android avd
and then install an AVD, taking note of the following:
Start with an ARM ABI
Enable hardware keyboard: hw.keyboard=yes
Enable hardware battery: hw.battery=yes
Use the Host GPU
Here's an example:
Phone:
> android list avd Available Android Virtual Devices: Name: LatestAndroid Device: Nexus 5 (Google) Path: /Users/hankduan/.android/avd/LatestAndroid.avd Target: Android 4.4.2 (API level 19) Tag/ABI: default/armeabi-v7a Skin: HVGA
Tablet:
> android list avd Available Android Virtual Devices: Name: LatestTablet Device: Nexus 10 (Google) Path: /Users/hankduan/.android/avd/LatestTablet.avd Target: Android 4.4.2 (API level 19) Tag/ABI: default/armeabi-v7a Skin: WXGA800-7in
Follow http://ant.apache.org/manual/index.html to install ant and set up the environment.
Follow http://maven.apache.org/download.cgi to install mvn (Maven) and set up the environment.
NOTE: Appium suggests installing Maven 3.0.5 (I haven't tried later versions, but 3.0.5 works for sure).
Install Appium using node npm install -g appium
. Make sure you don't install as sudo or else Appium will complain.
You can do this either if you installed node without sudo, or you can chown the global node_modules lib and bin directories.
Start emulator manually (at least the first time) and unlock screen.
> emulator -avd LatestAndroid
Your devices should show up under adb now:
> adb devices List of devices attached emulator-5554 device
If the AVD does not have chrome (and it probably won't if it just created), you need to install it:
You can get v34.0.1847.114 from http://www.apk4fun.com/apk/1192/
Once you download the apk, install to your AVD as such:
> adb install ~/Desktop/chrome-browser-google-34.0.1847.114-www.apk4fun.com.apk 2323 KB/s (30024100 bytes in 12.617s) Success
If you check your AVD now, it should have Chrome.
Ensure app is running if testing local app (Skip if testing public website):
> npm start # or `./scripts/web-server.js` Starting express web server in /workspace/protractor/testapp on port 8000
If your AVD isn't already started from the setup, start it now:
> emulator -avd LatestAndroid
Start Appium:
> appium info: Welcome to Appium v1.0.0-beta.1 (REV 6fcf54391fb06bb5fb03dfcf1582c84a1d9838b6) info: Appium REST http interface listener started on 0.0.0.0:4723 info: socket.io started
Note Appium listens to port 4723 instead of 4444
Configure protractor:
exports.config = { seleniumAddress: 'http://localhost:4723/wd/hub', specs: ['basic/*_spec.js'], // Reference: https://github.com/appium/sample-code/blob/master/sample-code/examples/node/helpers/caps.js capabilities: { browserName: 'chrome', 'appium-version': '1.0', platformName: 'Android', platformVersion: '4.4.2', deviceName: 'Android Emulator', }, baseUrl: 'http://10.0.2.2:8000', // configuring wd in onPrepare // wdBridge helps to bridge wd driver with other selenium clients // See https://github.com/sebv/wd-bridge/blob/master/README.md onPrepare: function () { var wd = require('wd'), protractor = require('protractor'), wdBridge = require('wd-bridge')(protractor, wd); wdBridge.initFromProtractor(exports.config); }};
Note the following:
baseUrl is 10.0.2.2 instead of localhost because it is used to access the localhost of the host machine in the android emulator
selenium address is using port 4723
Setting Up Protractor with Appium - iOS/Safari
Install Java SDK (>1.6) and configure JAVA_HOME (Important: make sure it's not pointing to JRE).
Follow http://ant.apache.org/manual/index.html to install ant and set up the environment.
Follow http://maven.apache.org/download.cgi to install mvn (Maven) and set up the environment.
NOTE: Appium suggests installing Maven 3.0.5 (I haven't tried later versions, but 3.0.5 works for sure).
Install Appium using node npm install -g appium
. Make sure you don't install as sudo or else Appium will complain.
You can do this either if you installed node without sudo, or you can chown the global node_modules lib and bin directories.
Run the following: appium-doctor
and authorize_ios
(sudo if necessary)
You need XCode >= 4.6.3, 5.1.1 recommended. Note, iOS8 (XCode 6) did not work off the shelf (see https://github.com/appium/appium/pull/3517) but this was resolved soon after Oct 13, 2014
Ensure app is running if testing local app (Skip if testing public website):
> npm start # or `./scripts/web-server.js` Starting express web server in /workspace/protractor/testapp on port 8000
Start Appium:
> appium info: Welcome to Appium v1.0.0-beta.1 (REV 6fcf54391fb06bb5fb03dfcf1582c84a1d9838b6) info: Appium REST http interface listener started on 0.0.0.0:4723 info: socket.io started
Note: Appium listens to port 4723 instead of 4444.
Configure protractor:
additional dependencies:
npm install --save-dev wd wd-bridge
iPhone:
exports.config = { seleniumAddress: 'http://localhost:4723/wd/hub', specs: [ 'basic/*_spec.js' ], // Reference: https://github.com/appium/sample-code/blob/master/sample-code/examples/node/helpers/caps.js capabilities: { browserName: 'safari', 'appium-version': '1.0', platformName: 'iOS', platformVersion: '7.1', deviceName: 'iPhone Simulator', }, baseUrl: 'http://localhost:8000', // configuring wd in onPrepare // wdBridge helps to bridge wd driver with other selenium clients // See https://github.com/sebv/wd-bridge/blob/master/README.md onPrepare: function () { var wd = require('wd'), protractor = require('protractor'), wdBridge = require('wd-bridge')(protractor, wd); wdBridge.initFromProtractor(exports.config); }};
iPad:
exports.config = { seleniumAddress: 'http://localhost:4723/wd/hub', specs: [ 'basic/*_spec.js' ], // Reference: https://github.com/appium/sample-code/blob/master/sample-code/examples/node/helpers/caps.js capabilities: { browserName: 'safari', 'appium-version': '1.0', platformName: 'iOS', platformVersion: '7.1', deviceName: 'IPad Simulator', }, baseUrl: 'http://localhost:8000', // configuring wd in onPrepare // wdBridge helps to bridge wd driver with other selenium clients // See https://github.com/sebv/wd-bridge/blob/master/README.md onPrepare: function () { var wd = require('wd'), protractor = require('protractor'), wdBridge = require('wd-bridge')(protractor, wd); wdBridge.initFromProtractor(exports.config); }};
Note the following:
note capabilities
baseUrl is localhost (not 10.0.2.2)
selenium address is using port 4723
Setting Up Protractor with Selendroid
Install Java SDK (>1.6) and configure JAVA_HOME (Important: make sure it's not pointing to JRE).
Follow http://spring.io/guides/gs/android/ to install and set up Android developer environment. Do not set up Android Virtual Device as instructed here.
From commandline, 'android avd' and then follow Selendroid's recommendation (http://selendroid.io/setup.html#androidDevices). Take note of the emulator accelerator. Here's an example:
> android list avd Available Android Virtual Devices: Name: myAvd Device: Nexus 5 (Google) Path: /Users/hankduan/.android/avd/Hank.avd Target: Android 4.4.2 (API level 19) Tag/ABI: default/x86 Skin: WVGA800
Ensure app is running if testing local app (Skip if testing public website):
> npm start # or `./scripts/web-server.js` Starting express web server in /workspace/protractor/testapp on port 8000
Start emulator manually (at least the first time):
> emulator -avd myAvd HAX is working and emulator runs in fast virt mode
Note: The last line that tells you the emulator accelerator is running.
Start selendroid:
> java -jar selendroid-standalone-0.9.0-with-dependencies.jar ...
Once selendroid is started, you should be able to go to "http://localhost:4444/wd/hub/status" and see your device there:
{"value":{"os":{"name":"Mac OS X","arch":"x86_64","version":"10.9.2"},"build":{"browserName":"selendroid","version":"0.9.0"},"supportedDevices":[{"emulator":true,"screenSize":"WVGA800","avdName":"Hank","androidTarget":"ANDROID19"}],"supportedApps":[{"mainActivity":"io.selendroid.androiddriver.WebViewActivity","appId":"io.selendroid.androiddriver:0.9.0","basePackage":"io.selendroid.androiddriver"}]},"status":0}
Configure protractor:
exports.config = { seleniumAddress: 'http://localhost:4444/wd/hub', specs: [ 'basic/*_spec.js' ], capabilities: { 'browserName': 'android' }, baseUrl: 'http://10.0.2.2:8000'};
Note the following:
browserName is 'android'
baseUrl is 10.0.2.2 instead of localhost because it is used to access the localhost of the host machine in the android emulator