Détail du package

min-wd

mantoni16.9kMIT2.12.0

Minimal WebDriver that pipes stdin to browsers

browserify-plugin, webdriver, selenium, saucelabs

readme

Minimal WebDriver

Build Status SemVer License

Pipe scripts to browsers using the Selenium WebDriver protocol.

  • SauceLabs support
  • Appium support for mobile testing
  • Selenium Server 2 support
  • Concurrent test runs
  • No web server required

Install

npm install min-wd

Usage

Put a config file name .min-wd in your project directory:

{
  "hostname": "localhost",
  "port": 4444,
  "browsers": [{
    "name": "internet explorer",
    "version": "10"
  }, {
    "name": "chrome"
  }]
}

You can also have the .min-wd file be loaded as a module:

var hostname = true ? "localhost" : "otherhost";

module.exports = {
  "hostname": hostname,
  "port": 4444,
  "browsers": [{
    "name": "internet explorer",
    "version": "10"
  }, {
    "name": "chrome"
  }]
}

Alternatively, add a webdriver property with the configs to your package.json file.

Assuming my-script.js contains this:

console.log('Hello %s!', 'browser');
process.exit(0);

Use with browserify:

$ browserify -p min-wd my-script.js
# internet explorer 9:
Hello browser!
# chrome *:
Hello browser!

Additional Selenium capabilities and browser-specific capabilities can be specified with the capabilities property:

{
  "hostname": "localhost",
  "port": 4444,
  "browsers": [{
    "name": "chrome",
    "capabilities": {
      "chromeOptions": {
        "args": ["--headless", "--disable-gpu"]
      }
    }
  }]
}

Shareable configuration package

Inspired by ESLint's shareable configuration package, there is the possibility of storing selenium and browser-specific capabilities in a separate npm package. This way one config can be shared amongst many npm packages instead of them each having their own .min-wd file.

Usage

Create a npm package and name it using the prefix min-wd-config- (eg. min-wd-config-myapp).

The shareable config must contain a js file that exports an object with the configuration or a .min-wd file.

Example: index.js

module.exports = {
  "hostname": "localhost",
  "port": 4444,
  "browsers": [{
    "name": "chrome"
  }]
}

In the shareable config's package.json you will need to reference the file containing the config:

{
  "name": "min-wd-config-myapp",
  "version": "^1.0.0",
  "webdriver": {
    "extends": "./index.js"
  }
}

In the shareable config's dependent, that is the package that consumes the shareable config, the config name without the min-wd-config- prefix needs to be specified:

{
  "name": "myapp",
  "webdriver": {
    "extends": "myapp"
  },
  "devDependencies": {
    "min-wd-config-myapp": "^1.0.0"
  }
}

When using a shareable config and a .min-wd file, the latter will take precedence.

SauceLabs

Export your SauceLabs credentials:

export SAUCE_USERNAME="your-user-name"
export SAUCE_ACCESS_KEY="your-access-key"

Enable SauceLabs in your .min-wd file:

{
  "sauceLabs": true,
  "browsers": [...]
}

See "Supported options" for additional SauceLabs specific options and "SauceLabs on Travis" on how to run min-webdriver tests on Travis.

Appium

Note: This has only be tested on Mac OS X High Sierra with the iOS Simulator so far. If you have successfully tested with other configurations, please file an issue so that we can extend the docs.

Setup for iOS Simulator on Mac OS X:

  • npm install -g appium
  • brew install carthage
  • Configure your .min-wd file like this:
{
  "hostname": "localhost",
  "port": 4723,
  "browsers": [{
    "name": "Safari",
    "platformName": "iOS",
    "platformVersion": "11.2",
    "deviceName": "iPhone Simulator"
  }]
}
  • Run appium which should start a server on port 4723
  • Run your tests

BrowserStack

Export your BrowserStack credentials:

export BROWSERSTACK_USERNAME="your-user-name"
export BROWSERSTACK_ACCESS_KEY="your-access-key"

Example .min-wd file:

module.exports = {
  "hostname": "hub-cloud.browserstack.com",
  "port": 80,
  "browsers": [{
    "name": "chrome",
    "capabilities": {
      "browser": "Chrome",
      "browserstack.user": process.env.BROWSERSTACK_USERNAME,
      "browserstack.key": process.env.BROWSERSTACK_ACCESS_KEY
    }
  }]
}

Loading a web page

By default, min-webdriver will fork a new browser and inject the given script straight away without loading any web page. If you want to run your test cases in the context of a web page, you can configure the start page in the .min-wd file:

{
  "url": "http://my-test-page"
}

Mocha Support

Testing with Mocha requires mocaccino:

$ browserify -p mocaccino -p min-wd my-test.js

If this is your use case, make sure to give Mochify a try.

Timeouts

The default timeout for the log polling script is 10 seconds. If you have long running test cases that don't print anything for more than 10 seconds, you can increase the timeout by adding a timeout property to your config:

"timeout": 20000

Notice: This option is not used if explicitly setting the asyncPolling option to false.

API

Use min-wd programatically with browserify like this:

var browserify = require('browserify');
var minWd = require('min-wd');

var b = browserify();
b.plugin(minWd, { timeout : 0 });

Supported options

  • wdFile specify the location of the .min-wd config file. Defaults to .min-wd.
  • sauceLabs whether to run tests with saucelabs. Defaults to false.
  • hostname the host to connect to. Defaults to localhost. If sauceLabs is true, ondemand.saucelabs.com is used.
  • port the port to connect to. Defaults to 4444. If sauceLabs is true, 80 is used.
  • asyncPolling whether to use async polling when looking for test results. Defaults to true.
  • timeout if a script does not respond to log polling calls for this amount of milliseconds, the test run is aborted. Defaults to 10 seconds.
  • url the URL to open in each browser. Defaults to no URL.
  • closeOnSuccess whether to close browsers on success. Defaults to true.
  • closeOnError whether to close browsers on error. Defaults to true.
  • browsers an array of browser config objects, each with these properties:
    • name the name of the browser to launch, e.g. chrome, firefox or internet explorer
    • version the browser version to launch. Use * for any.
    • url an optional URL to launch for this browser
    • capabilities additional Selenium capabilities and browser-specific capabilities

Some options are only considered depending on the asyncPolling value:

  • pollingInterval sets the time interval between test log checks. Only apply if asyncPolling is false. Defaults to 1000 milliseconds.
  • timeout option won't apply if asyncPolling is set to false because the test log is checked manually respecting pollingInterval.

SauceLabs specific options that only apply if sauceLabs is set to true:

  • sauceJobName sets a custom name for the SauceLabs job. If a package.json file exists in the current directory, this defaults to the package name.
  • BUILD_VAR sets the environment variable name that contains a build number to set, e.g. TRAVIS_BUILD_NUMBER.

SauceLabs on Travis

Assuming you have your linter and headless tests in an npm "test" script and the SauceLabs tests in a script called "wd", then the SauceLabs builds can be used by configuring your .travis.yml like this:

language: node_js
node_js:
  - "0.12"
  - "4.2"

env:
  global:
    - SAUCE_USERNAME=mantoni
    - secure: "your-secured-access-key"

script:
  - 'npm test'
  - 'if [ "x$TRAVIS_NODE_VERSION" = "x4.2" ]; then npm run wd; fi'

This will run npm test on Node 0.12 and 4.2 while running the "wd" script only in the node 4.2 build. See the Travis documentation for encryption keys for details about the secure config.

Known issues and solutions

min-webdriver injects your script directly into the default page launched by the Selenium driver. In some cases browsers behave strangely in this context. Work around this by specifying a URL to a simple web page that is loaded before running the tests:

{
  "browsers": [{
    "name": "Internet Explorer",
    "version": "9",
    "url": "http://my-server/doctype.html"
  }]
}

With this content in the doctype.html:

<!DOCTYPE html><html><head><meta encoding="utf-8"></head><body></body></html>

You can also specify a "url" for all browser on the root level.

Loading a page before injecting the scripts is solving these issues:

  • IE 9 reporting it can't find JSON because the Selenium default page makes IE switch to quirks mode
  • Error: SECURITY_ERR: DOM Exception 18 because setting cookies is not allowed for file:// URLs
  • Error: access to the Indexed Database API is denied in this context
  • localStorage being inaccessible.
  • iOS Simulator does not report anything: Set asyncPolling: false

Usage with Microsoft Edge browser

To configure edge use { "name": "microsoftedge" }. For the time being, MS Edge doesn't support asyncPolling set to true. If you want to test with that browser you must set asyncPolling to false.

Compatibility

  • Node 0.10, 0.12, 4.x, 5.x
  • Selenium Server 2.39 or later

License

MIT

changelog

Changes

2.12.0

A change from Thomas Junghans now allows to have sharable configs. It works similar to sharable configs in eslint. Check out the readme for instructions.

  • 1d5b9a2 feature: add shareable config support (Thomas Junghans)
  • a3ce836 Add contributor
  • df66b9d Update Studio Changes for --footer support

Released by Maximilian Antoni on 2018-09-05.

2.11.2

  • 7728d9f Fix issue in request module invoking a callback without both an error and a response (Davide Callegari)
  • 437bc7f Add contributor (Maximilian Antoni)
  • 25cf173 Update Studio Changes (Maximilian Antoni)
  • aa3ea84 Run build in node 10 (Maximilian Antoni)

2.11.1

2.11.0

Steffen André Langnes added the ability to configure custom capabilities.

  • Allow custom capabilities
  • Fix example in readme for loading .min-wd file as module
  • Add BrowserStack example to readme

2.10.0

  • Support Appium with iOS Simulator
  • Fix "SauceLabs on Travis" link
  • Update Mocha link (Morton Fox)

2.9.3

Decrease buffer size even further due to Chrome issue still occurring.

2.9.2

Further decreases the buffer size introduced in v2.9.1 to work around the Chrome driver issue which still occurs occasionally.

2.9.1

Running test suits or projects sometimes caused issues with Chrome. This appears to be an issue with a buffer size limit when executing scripts through chromedriver.

With this path, scripts are no longer injected directly. Instead, a small receiver function is injected and the actual test code is sent to that function in chunks, bypassing the buffer limit. Once the script was fully received by the browser, it is injected with a new <script> tag.

Related issues:

2.9.0

Moshe Kolodnya made it possible to use a different config file. He also sent a PR to allow the .min-wd file to be loaded as a node module. Thanks!

2.8.0

  • Streams 3: bump dependencies

2.7.0

  • Add the option to test using synchronous polling (Matheus Kautzmann)
  • Bump saucelabs version to ^1.0 (Matheus Kautzmann)

2.6.1

  • Update through2 to ^1.1

2.6.0

  • Default sauceJobName to the name property in cwd package.json

2.5.1

  • Improve documentation for SauceLabs specific options

2.5.0

  • Update Sauce Job with passed and build attribute (az7arul)

2.4.2

  • Fix write after end bug

2.4.1

  • Start log polling more quickly
  • Write out parsed response status code in failure cases

2.4.0

  • Pipe output back to browserify instead of stdout

2.3.0

  • Add closeOnError and closeOnSuccess options (Dustin Wyatt)

2.2.2

  • Print browser names with leading '#'

2.2.1

  • Wait for queue drain before continue polling
  • Don't end queue twice

2.2.0

  • Bump resolve and source-mapper to ^1.0

2.1.1

  • Log error output to context.out instead of process.stderr

2.1.0

  • Map stack traces to original sources using inline source maps

2.0.2

  • Pipe output to stdout again

2.0.1

  • Remove brout again

2.0.0

  • Convert from transform into plugin

1.0.0

  • Use brout 1.0

0.4.5

  • Only inject require into .js files
  • Attempt to parse error message from Selenium WebDriver server

0.4.4

  • Bump brout

0.4.3

  • Set timeout to 0 to skip setting a log polling timeout

0.4.2

  • Load a url for a specific browser (for IE 9 doctype workaround)
  • Configure timeout for log polling
  • Improved log flushing
  • Improved http error handling for 302 / 303 responses

0.4.1

  • Stream browser output instead of buffering per browser. Prints logs from first browser in the queue as they arrive, buffering up the other ones.

0.4.0

  • SauceLabs support
  • Load options from package.json

0.3.0

  • Support for custom start URL

0.2.0

  • Added callback API
  • Simplified transform

0.1.0

  • Initial release