包详细信息

jasminewd2

angular3.2mMIT2.2.0

WebDriverJS adapter for Jasmine2.

test, testing, webdriver, webdriverjs

自述文件

jasminewd2 Build Status

Adapter for Jasmine-to-WebDriverJS. Used by Protractor.

Important: There are two active branches of jasminewd.

  • jasminewd1 is an adapter for Jasmine 1.3, and uses the package minijasminenode. It is published to npm as jasminewd.
  • jasminewd2 is an adapter for Jasmine 2.x, and uses the package jasmine. It is published to npm as jasminewd2.

Features

  • Automatically makes tests asynchronously wait until the WebDriverJS control flow is empty.

  • If a done function is passed to the test, waits for both the control flow and until done is called.

  • If a test returns a promise, waits for both the control flow and the promise to resolve.

  • Enhances expect so that it automatically unwraps promises before performing the assertion.

Installation

npm install jasminewd2

Usage

In your setup:

var JasmineRunner = require('jasmine');
var jrunner = new JasmineRunner();
var webdriver = require('selenium-webdriver');

global.driver = new webdriver.Builder().
    usingServer('http://localhost:4444/wd/hub').
    withCapabilities({browserName: 'chrome'}).
    build();

require('jasminewd2').init(driver.controlFlow(), webdriver);

jrunner.projectBaseDir = '';
jrunner.execute(['**/*_spec.js']);

In your tests:

describe('tests with webdriver', function() {
  it('will wait until webdriver is done', function() {
    // This will be an asynchronous test. It will finish once webdriver has
    // loaded the page, found the element, and gotten its text.
    driver.get('http://www.example.com');

    var myElement = driver.findElement(webdriver.By.id('hello'));

    // Here, expect understands that myElement.getText() is a promise,
    // and resolves it before asserting.
    expect(myElement.getText()).toEqual('hello world');
  });
})

TypeScript

For the typings related to the changes in the global jasmine variables (e.g. allowing it() blocks to return a promise), we publish the package @types/jasminewd2. If you are writing tests using jasminewd (including Protractor tests), be sure to include @types/jasminewd2 in your devDependencies, as these global type modifications are not bundled with the jasminewd2 npm module.

jasminewd also exports one function directly: init. Unfortunately, we do not publish typings for this function. If you call this function directly (e.g. you are a Protractor dev), you should simply do:

require('jasminewd2').init(controlFlow, webdriver);

async functions / await

async functions and the await keyword are likely coming in ES2017 (ES8), and available via several compilers. At the moment, they often break the WebDriver control flow. (GitHub issue). You can still use them, but if you do then you will have to use await/Promises for almost all your synchronization. See spec/asyncAwaitAdapterSpec.ts and spec/asyncAwaitErrorSpec.ts for examples.

更新日志

Changelog for jasminewd2

2.2.0

Dependencies

Update selenium-webdriverjs to 3.5.0.

2.1.0

Features

  • (41577a5) support native async functions (node 7.6+) (#87)

Bug Fixes

  • (0137d3f) minor fix to keep stack from original error (#86)

  • (374f494) Allow to specify a function as a custom matcher's message. (#29)

2.0.0

(Skipping 1.x because 0.0.1 was originally accidently published as 1.0.0.)

Breaking changes

  • (fae803c) pass webdriver instance into init() instead of using require() (#83)

    So where as before you would write:

    require('jasminewd').init(webdriver.promise.controlFlow());
    

    Now you will write:

    require('jasminewd').init(webdriver.promise.controlFlow(), webdriver);
    

    This removes the dependency on selenium-webdriver and protects jasminewd from having a different webdriver instance than Protractor, which could be a huge problem if they had different control flow settings.

    This is a breaking change because it changes the API for the init function.

    I also removed the dependency on jasmine, which didn't do anything anyway. Maybe it should have been a peerDependency but those are deprecated.

Features

  • (171cbde) Added types (though you'll have to wait for @types/jasminewd2 to use them) (#79)
  • (27b4850) Support SELENIUM_PROMISE_MANAGER=0 (#72)

    There are three major ways this was done in this change:

    • In callWhenIdle, if flow.isIdle is not defined, we assume we are working with a SimpleScheduler instance, and so the flow is effectively idle.
    • In initJasmineWd, if flow.reset is not defined, we assume we are working with a SimpleScheduler instance, and so don't bother resetting the flow.
    • In wrapInControlFlow, we use flow.promise to create a new promise if possible. Since new webdriver.promise.Promise() would have always made a ManagedPromise, but flow.promise will do the right thing.
    • In wrapCompare, we avoid the webdriver library entirely, and never instance any extra promises. Using webdriver.promise.when and webdriver.promise.all could have been a problem if our instance of webdriver had the control flow turned on, but another instance somewhere did not (or even the same instance, but just at a different point in time). Instead we use the new maybePromise tool, which is a mess but is also exactly what we want.
    • In specs/*, we replace webdriver.promise.fulfilled with webdriver.promise.when.
    • In specs/*, a new version of adapterSpec.js and errorSpec.js are created: asyncAwaitAdapterSpec.ts and asyncAwaitErrorSpec.ts.

    I also also fixed a minor bug where we weren't correctly checking for promises inside an array of expected results. Before we had:

    expected = Array.prototype.slice.call(arguments, 0);
    
    ...
    
    webdriver.promise.isPromise(expected);
    

    I thought about it for a little while, and there's no way that's correct. expected is an Array<any>, there's no way it has a .then function.

    Closes https://github.com/angular/jasminewd/issues/69

Bug Fixes

  • (369a249) Don't rely on webdriver.promise functions (#82)

    While we support SELENIUM_PROMISE_MANAGER=0 already, we rely on SimpleScheduler and some other utility functions which will be going away after the control flow has been fully deprecated. This commit allows jasminewd to work without those utility functions, and even allows people to pass jasminewd their own custom scheduler implementation.

    This does not fix our tests, which will also break when those utility functions go away. See https://github.com/angular/jasminewd/issues/81

    Closes https://github.com/angular/jasminewd/issues/80

0.1.1

  • (cf1cd34) chore(isPromise): revert expose deferred object's promise (#78)

0.1.0

Release for the selenium-webdriver 3.0.1 upgrade.

0.1.0-beta.1

  • (5fe36a6) deps(selenium-webdriver): upgrade to 3.0.0 (#63)

    fix test "should wait till the expect to run the flow"

    • isPending exists but it is no longer part of ManagedPromise
    • isPending also is no longer exported in lib/promise.js
    • wrote an isPending similar to selenium-webdriver in common.js require a minimum node version

    • selenium-webdriver 3.0.0 requires node >= 6.9.0

    • update travis test to use node 6

0.1.0-beta.0

This beta release is for the selenium-webdriver 3.0.0-beta-3 upgrade.

Dependencies

  • (70c9f62) upgrade(isPromise): expose the deferred object's promise (#58)

    • isPromise checks to see if the input parameter has a then method
    • Deferred class has a promise property and no longer has a then method
  • (8870365) deps(selenium-webdriver): upgrade to 3.0.0-beta-3 (#57)

0.0.10

  • (ff2e624) fix(webdriver): Pass in the control flow.

    BREAKING CHANGE: The control flow now needs to be passed in when using jasminewd. This fixes an issue where having multiple versions of selenium-webdriver in a package's dependency tree would result in jasminewd and protractor using different control flows. You now have to initialize jasminewd before you can use it, like so: require('jasminewd2').init(webdriver.promise.controlFlow());

    See https://github.com/angular/protractor/issues/3505

  • (db26b1a) fix(stacktrace): do not crash if beforeEach block is rejected without any stated reason (#45)

0.0.9

  • (790c81e) fix(expectations): allow custom matchers to return a promise when actual is not a promise

    See angular/protractor#2964

0.0.8

  • (5abc745) chore(jasmine): update MatchFactory to allow message as function

  • (750898c) fix(expectation): expectations without promises no longer add to task queue

    Instead, expectations without promises in either expected or actual are unchanged from the original Jasmine implementation.

    See https://github.com/angular/protractor/issues/2894

0.0.7

  • (55fd11e) fix(index): forward it's return value

  • (f4c30a0) fix: allow empty it functions

0.0.6

  • (4776c16) chore(selenium-webdriver): update selenium webdriver to 2.47.0

    Update selenium-webdriver to 2.47.0 from 2.45.1. This update introduces a convoluted situation where some tests in Proractor's suite would hang - see https://github.com/angular/protractor/issues/2245

    This change includes a fix for those issues which removes the explicit flow.execute wrapper around expect calls. This appears not to introduce any issues to existing tests.

0.0.5

  • (037c7de) chore(dependencies): update Jasmine to 2.3.1

0.0.4

  • (8f8b8b3) tests(context): test that the this variable points to the right thing

    Note: this means that using this.addMatchers no longer works inside before blocks or specs. It should have been changed to jamsine.addMatchers since the upgrade to Jasmine 2. It was still working by accident up until the previous commit.

  • (c0f13d2) refactor(asyncTestFn): refactor async test wrapping to show more info

    Test wrapping for Jasmine 2 now more closely follows the test wrapping for Mocha at https://github.com/SeleniumHQ/selenium/blob/master/javascript/node/selenium-webdriver/testing/index.js

    This also adds more information to the task names in the control flow, for easier debugging.

0.0.3

  • (161e1fa) fix(errors): update webdriverjs, fix asynchronous error output

    Add some console logging, remove useless info about the last running task in the control flow, and fix error where problems reported from done.fail were getting pushed into the following spec.

    Closes #18

  • (fdb03a3) docs(readme): add note about jasmine 1 vs jasmine 2

  • (acaec8b) feat(index): add jasmine2.0 support