karma-selenium-grid-launcher
Version:
Launcher for Remote WebDriver instances on a Selenium Grid; forked from karma-webdriver-launcher.
252 lines (175 loc) • 8.96 kB
Markdown
karma-selenium-grid-launcher
========================
A plugin for Karma that launches browsers on a remote [Selenium Grid].
Forked from [karma-webdriver-launcher].
Uses the [selenium-webdriver NPM module] behind the scenes.
[karma-webdriver-launcher]: https://github.com/karma-runner/karma-webdriver-launcher
[Selenium Grid]: https://www.seleniumhq.org/docs/07_selenium_grid.jsp
[selenium-webdriver NPM module]: https://www.npmjs.com/package/selenium-webdriver
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
- [Usage](#usage)
- [Launcher-Specific Configuration Keys](#launcher-specific-configuration-keys)
- [arguments](#arguments)
- [base](#base)
- [closeBeforeQuit](#closebeforequit)
- [delayLaunch](#delaylaunch)
- [extensions](#extensions)
- [firefoxPreferences](#firefoxpreferences)
- [gridUrl](#gridurl)
- [heartbeatInterval](#heartbeatinterval)
- [options](#options)
- [promptOn (deprecated)](#prompton-deprecated)
- [resetBeforeQuit](#resetbeforequit)
- [suppressWarning](#suppresswarning)
- [windowGeometry](#windowgeometry)
- [x-ua-compatible](#x-ua-compatible)
- [Killing Tests Prematurely](#killing-tests-prematurely)
- [Browser Quirks and Workarounds](#browser-quirks-and-workarounds)
- [Video Playback on macOS Safari](#video-playback-on-macos-safari)
- [iOS 10 Safari](#ios-10-safari)
- [iOS 12 Safari](#ios-12-safari)
- [Examples](#examples)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
## Usage
```bash
$ npm install --save-dev karma-selenium-grid-launcher
```
In your karma.conf.js file define some custom launchers that inherit from
`SeleniumGrid`, providing the URL of the Selenium Grid as `gridUrl`.
```js
module.exports = function(karma) {
...
config.set({
...
customLaunchers: {
'ie11': {
base: 'SeleniumGrid',
gridUrl: 'http://some-host:4444/wd/hub',
browserName: 'internet explorer',
platform: 'windows',
version: '11',
'x-ua-compatible': 'IE=EmulateIE7',
heartbeatInterval: 10000
}
},
browsers: ['ie11'],
...
});
```
Other than the launcher-specific configuration keys described below, all keys
are passed along to the grid as capabilities, giving you the flexibility to
do anything the corresponding Selenium WebDriver supports (see the Selenium
docs for more information).
Note that if you're trying to test on several browsers/platforms and you're
using the default Selenium matcher, you'll probably want to make use of the
undocumented `applicationName` capability, as the only platforms that
Selenium will match are `WINDOWS`, `MAC`, and `LINUX`.
You may also wish to use the [browser constants] exported by selenium-webdriver
to make sure you're using the `browserName` expected by selenium.
[browser constants]: https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index_exports_Browser.html
## Launcher-Specific Configuration Keys
The following keys provided as part of a `customLauncher` block will *not* be
interpreted as a capability to send to the Grid; instead, they are processed
in some way by the launcher.
### arguments
Array of arguments that should be used when launching the browser binary. Note
that only Chrome, Firefox, and IE accept this key; an error will be thrown if
another `browserName` is used.
### base
This is obviously only used by Karma to tell it from which base to extend, but
it's included here to make it clear that `base` will not be passed along as a
capability.
### closeBeforeQuit
Call `driver.close()` before calling `driver.quit()`. Set this to `true` to
work around browsers/devices which don't implicitly close the active window
when testing finishes.
See the [Browser Quirks and Workarounds] section for which browsers/devices
may require this for proper functionality.
### delayLaunch
Time in ms to wait before launching a browser. Use this when a browser must
end up as the foreground window for tests to pass, such as testing video
playback on Safari.
### extensions
Array of extension paths that should be installed on the remote browser. Note
that only Chrome and Firefox accept this key; an error will be thrown if
another `browserName` is used.
### firefoxPreferences
Object mapping Firefox preference keys to their desired value. If you wish to
override one of the preferences passed to firefox by default, this will do
the trick.
### gridUrl
The URL of the Selenium Grid to use to launch browsers. If not provided, it
will default to `http://localhost:4444/wd/hub`.
### heartbeatInterval
Interval in ms to send a heartbeat to avoid the session being killed by
timeout. If not provided or set to `0`, no heartbeat will be performed.
### options
Object mapping a method name for the appropriate `Options` object of the
browser to the value with which it should be called. See the
[selenium-webdriver API docs] for more information.
### promptOn (deprecated)
Send and then close a prompt when an element with the given `id` is found in
the document.
This option is deprecated, and is probably not needed in any scenario.
### resetBeforeQuit
Have the browser load `about:blank` before calling `driver.quit()`. Set this
to `true` to work around browsers/devices which don't support closing the
active window when testing finishes.
See the [Browser Quirks and Workarounds] section for which browsers/devices
may require this for proper functionality.
### suppressWarning
A value of `true` will suppress the internet explorer warning; any other value
will cause the warning to be displayed.
### windowGeometry
Object to use for setting the geometry of the window. If any of the keys
`width`, `height`, `x`, or `y` are present in the object, they will be used to
modify just that aspect of the window geometry. Any other keys will be ignored.
### x-ua-compatible
The value to use for an `X-UA-Compatible` `meta` tag. If not provided, Karma
will not add the `meta` tag.
[selenium-webdriver API docs]: https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/
[Browser Quirks and Workarounds]: #browser-quirks-and-workarounds
## Killing Tests Prematurely
If you stop tests prematurely (e.g. by hitting `Ctrl+c`) soon after launching
the tests, it may take some time for the browsers/devices to fully close. To
keep things simple(ish), there are a series of promises during
startup/initialization. When you stop the requests determines where in this
series there will be a call to `driver.quit()`.
If the remote driver has returned a session, then you will have to wait for
the browser/device to load the karma page and perform its initialization
before `driver.quit()` will be called.
If you're using mobile devices, also keep in mind that building/deploying
the controller app and/or starting a simulator can take some time. Since
the driver can only be used after this has finished, you must wait for this
process to complete to ensure proper cleanup.
From the time you stop the tests until a particular browser has closed, the
message `Waiting for ${browser} to quit... (${time}s)` will be output to the
console every 10s.
## Browser Quirks and Workarounds
This is a list of known compatibility issues for certain browsers/devices,
and how to work around those issues.
If you encounter any browser quirks not listed here, please open a PR that
adds it, even if there is no known workaround.
### Video Playback on macOS Safari
macOS Safari requires that it is the foreground window to play back video. Use
the [`delayLaunch`](#delayLaunch) option to ensure that Safari launches after
any other browsers on the same machine.
Note also that the video element must have some portion within the viewport
being displayed by the browser. In your tests, ensure this is done.
### iOS 10 Safari
iOS 10 Safari does not implicitly close the current window when `driver.quit()`
is called, as specified by the WebDriver spec. This causes the browser to
connect twice during the next test run; the old window and the newly-launched
window. You should use the [`closeBeforeQuit`](#closeBeforeQuit) option to
ensure the window is closed at the end of each test run.
### iOS 12 Safari
iOS 12 Safari does not support closing the current window either through
`driver.close()` or `driver.quit()`. This causes the old window to connect
to the next run, before being disconnected (the new test run reuses the old
window, so the page effectively refreshes). You should use the
[`resetBeforeQuit`](#resetBeforeQuit) option to ensure the window is set to
`about:blank` at the end of each test run.
## Examples
For a more detailed example, see [the example file].
[the example file]: https://github.com/squarebracket/karma-selenium-grid-launcher/blob/master/examples/karma.conf.js