自动化端对端测试框架-Protractor Reference 3

不问归期 提交于 2019-11-29 00:02:23

Upgrading from Jasmine 1.3 to 2.x

First, please read Jasmine's official upgrade documentation.

In your conf file

Specify that you want to use jasmine2.x:

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":

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).

In your specs

Focused specs

Instead of iit, please use fit. Instead of ddescribe, please use fdescribe.

Timeouts

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.

Custom matchers

See http://jasmine.github.io/2.0/upgrading.html#section-Custom_Matchers

Before:

toHaveText: function(expectedText) {
  return this.actual.getText().then(function(actualText) {
    return expectedText === actualText;
  });}

Now:

toHaveText: function() {
  return {
    compare: function(actual, expectedText) {
      return {
        pass: actual.getText().then(function(actualText) {
          return actualText === expectedText;
        })
      };
    }
  };}

Asynchronous specs

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.

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);});

Reporters

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.

Mobile Setup

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

Setup
  • 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:

> 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.

Running Tests
  • 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

Setup
  • 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

Running Tests
  • 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

Setup
  • 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

Running Tests
  • 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
...

{"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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!