Socket
Socket
Sign inDemoInstall

selenium-webdriver

Package Overview
Dependencies
Maintainers
8
Versions
99
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

selenium-webdriver - npm Package Compare versions

Comparing version 4.18.1 to 4.19.0

bidi/browser.js

84

bidi/addInterceptParameters.js

@@ -18,3 +18,3 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

const {UrlPattern} = require("./urlPattern");
const { UrlPattern } = require('./urlPattern')

@@ -27,3 +27,3 @@ class AddInterceptParameters {

if (phases instanceof Array) {
phases.forEach(phase => this.#phases.push(phase))
phases.forEach((phase) => this.#phases.push(phase))
} else {

@@ -34,56 +34,50 @@ this.#phases.push(phases)

urlPattern(pattern)
{
if (!pattern instanceof UrlPattern) {
throw new Error(`Pattern must be an instance of UrlPattern. Received: '${pattern})'`)
urlPattern(pattern) {
if (!(pattern instanceof UrlPattern)) {
throw new Error(`Pattern must be an instance of UrlPattern. Received: '${pattern})'`)
}
this.#urlPatterns.push(Object.fromEntries(pattern.asMap()))
return this
}
urlPatterns(patterns) {
patterns.forEach((pattern) => {
if (!(pattern instanceof UrlPattern)) {
throw new Error(`Pattern must be an instance of UrlPattern. Received:'${pattern}'`)
}
this.#urlPatterns.push(Object.fromEntries(pattern.asMap()))
return this
}
})
return this
}
urlPatterns(patterns)
{
patterns.forEach(pattern => {
if (!pattern instanceof UrlPattern) {
throw new Error(`Pattern must be an instance of UrlPattern. Received:'${pattern}'`)
}
this.#urlPatterns.push(Object.fromEntries(pattern.asMap()))
})
return this
urlStringPattern(pattern) {
if (!(pattern instanceof String)) {
throw new Error(`Pattern must be an instance of String. Received:'${pattern}'`)
}
urlStringPattern(pattern)
{
if (!pattern instanceof String) {
this.#urlPatterns.push({ type: 'string', pattern: pattern })
return this
}
urlStringPatterns(patterns) {
patterns.forEach((pattern) => {
if (!(pattern instanceof String)) {
throw new Error(`Pattern must be an instance of String. Received:'${pattern}'`)
}
this.#urlPatterns.push({ type: 'string', pattern: pattern })
})
return this
}
this.#urlPatterns.push({'type': 'string', 'pattern': pattern})
return this
asMap() {
const map = new Map()
map.set('phases', this.#phases)
if (this.#urlPatterns.length > 0) {
map.set('urlPatterns', this.#urlPatterns)
}
urlStringPatterns(patterns)
{
patterns.forEach(pattern => {
if (!pattern instanceof String) {
throw new Error(`Pattern must be an instance of String. Received:'${pattern}'`)
}
this.#urlPatterns.push({'type': 'string', 'pattern': pattern})
})
return this
}
asMap()
{
const map = new Map()
map.set('phases', this.#phases)
if (this.#urlPatterns.length > 0) {
map.set('urlPatterns', this.#urlPatterns)
}
return map
}
return map
}
}
module.exports = {AddInterceptParameters}
module.exports = { AddInterceptParameters }

@@ -19,2 +19,3 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

const { LocalValue } = require('./protocolValue')
class ArgumentValue {

@@ -21,0 +22,0 @@ constructor(value) {

@@ -74,2 +74,9 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

/**
* @returns id
*/
get id() {
return this._id
}
async init({ browsingContextId, type, referenceContext }) {

@@ -106,9 +113,2 @@ if (!(await this._driver.getCapabilities()).get('webSocketUrl')) {

/**
* @returns id
*/
get id() {
return this._id
}
/**
* @param url the url to navigate to

@@ -115,0 +115,0 @@ * @param readinessState type of readiness state: "none" / "interactive" / "complete"

@@ -44,2 +44,27 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

/**
* @returns {WebSocket}
*/
get socket() {
return this._ws
}
/**
* @returns {boolean|*}
*/
get isConnected() {
return this.connected
}
/**
* Get Bidi Status
* @returns {Promise<*>}
*/
get status() {
return this.send({
method: 'session.status',
params: {},
})
}
/**
* Resolve connection

@@ -61,16 +86,2 @@ * @returns {Promise<unknown>}

/**
* @returns {WebSocket}
*/
get socket() {
return this._ws
}
/**
* @returns {boolean|*}
*/
get isConnected() {
return this.connected
}
/**
* Sends a bidi request

@@ -189,13 +200,2 @@ * @param params

/**
* Get Bidi Status
* @returns {Promise<*>}
*/
get status() {
return this.send({
method: 'session.status',
params: {},
})
}
/**
* Close ws connection.

@@ -202,0 +202,0 @@ * @returns {Promise<unknown>}

@@ -21,2 +21,3 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

const { WebElement } = require('../lib/webdriver')
const { RemoteReferenceType, ReferenceValue } = require('./protocolValue')

@@ -61,2 +62,21 @@ class Input {

}
async setFiles(browsingContextId, element, files) {
if (typeof element !== 'string' && !(element instanceof ReferenceValue)) {
throw Error(`Pass in a WebElement id as a string or a ReferenceValue. Received: ${element}`)
}
const command = {
method: 'input.setFiles',
params: {
context: browsingContextId,
element:
typeof element === 'string'
? new ReferenceValue(RemoteReferenceType.SHARED_ID, element).asMap()
: element.asMap(),
files: typeof files === 'string' ? [files] : files,
},
}
await this.bidi.send(command)
}
}

@@ -63,0 +83,0 @@

@@ -24,2 +24,2 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

module.exports = {InterceptPhase}
module.exports = { InterceptPhase }

@@ -18,4 +18,7 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

const { BeforeRequestSent, ResponseStarted, FetchError} = require('./networkTypes')
const {AddInterceptParameters} = require("./addInterceptParameters");
const { BeforeRequestSent, ResponseStarted, FetchError } = require('./networkTypes')
const { AddInterceptParameters } = require('./addInterceptParameters')
const { ContinueResponseParameters } = require('./continueResponseParameters')
const { ContinueRequestParameters } = require('./continueRequestParameters')
const { ProvideResponseParameters } = require('./provideResponseParameters')

@@ -96,3 +99,3 @@ class Network {

callback(response)
}
}
})

@@ -102,5 +105,4 @@ }

async addIntercept(params) {
if (!params instanceof AddInterceptParameters) {
throw new Error(`Params must be an instance of AddInterceptParamenters. Received:'${params}'`)
if (!(params instanceof AddInterceptParameters)) {
throw new Error(`Params must be an instance of AddInterceptParameters. Received:'${params}'`)
}

@@ -110,3 +112,3 @@

method: 'network.addIntercept',
params: Object.fromEntries(params.asMap())
params: Object.fromEntries(params.asMap()),
}

@@ -122,3 +124,3 @@

method: 'network.removeIntercept',
params: {intercept: interceptId},
params: { intercept: interceptId },
}

@@ -131,16 +133,26 @@

const command = {
method: 'network.continueWithAuth',
params: {
request: requestId.toString(),
action: 'provideCredentials',
credentials: {
type: 'password',
username: username,
password: password
},
},
}
method: 'network.continueWithAuth',
params: {
request: requestId.toString(),
action: 'provideCredentials',
credentials: {
type: 'password',
username: username,
password: password,
},
},
}
await this.bidi.send(command)
}
async failRequest(requestId) {
const command = {
method: 'network.failRequest',
params: {
request: requestId.toString(),
},
}
await this.bidi.send(command)
}
async continueWithAuthNoCredentials(requestId) {

@@ -151,3 +163,3 @@ const command = {

request: requestId.toString(),
action: 'default'
action: 'default',
},

@@ -163,3 +175,3 @@ }

request: requestId.toString(),
action: 'cancel'
action: 'cancel',
},

@@ -170,2 +182,41 @@ }

async continueRequest(params) {
if (!(params instanceof ContinueRequestParameters)) {
throw new Error(`Params must be an instance of ContinueRequestParameters. Received:'${params}'`)
}
const command = {
method: 'network.continueRequest',
params: Object.fromEntries(params.asMap()),
}
await this.bidi.send(command)
}
async continueResponse(params) {
if (!(params instanceof ContinueResponseParameters)) {
throw new Error(`Params must be an instance of ContinueResponseParameters. Received:'${params}'`)
}
const command = {
method: 'network.continueResponse',
params: Object.fromEntries(params.asMap()),
}
await this.bidi.send(command)
}
async provideResponse(params) {
if (!(params instanceof ProvideResponseParameters)) {
throw new Error(`Params must be an instance of ProvideResponseParameters. Received:'${params}'`)
}
const command = {
method: 'network.provideResponse',
params: Object.fromEntries(params.asMap()),
}
await this.bidi.send(command)
}
async close() {

@@ -176,5 +227,5 @@ await this.bidi.unsubscribe(

'network.responseCompleted',
'network.authRequired')
'network.authRequired',
)
}
}

@@ -181,0 +232,0 @@

@@ -20,7 +20,50 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

const SameSite = {
STRICT: 'strict',
LAX: 'lax',
NONE: 'none',
findByName(name) {
return (
Object.values(this).find((type) => {
return typeof type === 'string' && name.toLowerCase() === type.toLowerCase()
}) || null
)
},
}
class BytesValue {
static Type = {
STRING: 'string',
BASE64: 'base64',
}
constructor(type, value) {
this._type = type
this._value = value
}
get type() {
return this._type
}
get value() {
return this._value
}
asMap() {
const map = new Map()
map.set('type', this._type)
map.set('value', this._value)
return map
}
}
class Header {
constructor(name, value, binaryValue) {
constructor(name, value) {
this._name = name
if (!(value instanceof BytesValue)) {
throw new Error(`Value must be an instance of BytesValue. Received:'${value}'`)
}
this._value = value
this._binaryValue = binaryValue
}

@@ -35,13 +78,8 @@

}
get binaryValue() {
return this._binaryValue
}
}
class Cookie {
constructor(name, value, binaryValue, domain, path, expires, size, httpOnly, secure, sameSite) {
constructor(name, value, domain, path, size, httpOnly, secure, sameSite, expires) {
this._name = name
this._value = value
this._binaryValue = binaryValue
this._domain = domain

@@ -64,6 +102,2 @@ this._path = path

get binaryValue() {
return this._binaryValue
}
get domain() {

@@ -192,5 +226,4 @@ return this._domain

let value = 'value' in header ? header.value : null
let binaryValue = 'binaryValue' in header ? header.binaryValue : null
this._headers.push(new Header(name, value, binaryValue))
this._headers.push(new Header(name, new BytesValue(value.type, value.value)))
})

@@ -208,6 +241,5 @@

let value = 'value' in cookie ? cookie.value : null
let binaryValue = 'binaryValue' in cookie ? cookie.binaryValue : null
let expires = 'expires' in cookie ? cookie.expires : null
this._cookies.push(new Cookie(name, value, binaryValue, domain, path, expires, size, httpOnly, secure, sameSite))
this._cookies.push(new Cookie(name, value, domain, path, size, httpOnly, secure, sameSite, expires))
})

@@ -461,2 +493,2 @@ this._headersSize = headersSize

module.exports = { BeforeRequestSent, ResponseStarted, FetchError }
module.exports = { Header, BytesValue, Cookie, SameSite, BeforeRequestSent, ResponseStarted, FetchError }

@@ -163,8 +163,12 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

class ReferenceValue {
#handle
#sharedId
constructor(handle, sharedId) {
if (handle === RemoteReferenceType.HANDLE) {
this.handle = sharedId
this.#handle = sharedId
} else if (handle === RemoteReferenceType.SHARED_ID) {
this.#sharedId = sharedId
} else {
this.handle = handle
this.sharedId = sharedId
this.#handle = handle
this.#sharedId = sharedId
}

@@ -175,8 +179,8 @@ }

const toReturn = {}
if (this.handle != null) {
toReturn[RemoteReferenceType.HANDLE] = this.handle
if (this.#handle != null) {
toReturn[RemoteReferenceType.HANDLE] = this.#handle
}
if (this.sharedId != null) {
toReturn[RemoteReferenceType.SHARED_ID] = this.sharedId
if (this.#sharedId != null) {
toReturn[RemoteReferenceType.SHARED_ID] = this.#sharedId
}

@@ -183,0 +187,0 @@

@@ -35,3 +35,3 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

async init(browsingContextId) {
async init(browsingContextIds) {
if (!(await this._driver.getCapabilities()).get('webSocketUrl')) {

@@ -42,3 +42,3 @@ throw Error('WebDriver instance must support BiDi protocol')

this.bidi = await this._driver.getBidi()
this._browsingContextId = browsingContextId
this._browsingContextIds = browsingContextIds
}

@@ -178,2 +178,10 @@

if (Array.isArray(this._browsingContextIds) && this._browsingContextIds.length > 0) {
params.contexts = this._browsingContextIds
}
if (typeof this._browsingContextIds === 'string') {
params.contexts = new Array(this._browsingContextIds)
}
const command = {

@@ -337,4 +345,4 @@ method: 'script.addPreloadScript',

async subscribeAndHandleEvent(eventType, callback) {
if (this._browsingContextIds != null) {
await this.bidi.subscribe(eventType, this._browsingContextIds)
if (this.browsingContextIds != null) {
await this.bidi.subscribe(eventType, this.browsingContextIds)
} else {

@@ -341,0 +349,0 @@ await this.bidi.subscribe(eventType)

@@ -18,4 +18,2 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

const {LocalValue} = require('./protocolValue')
class UrlPattern {

@@ -59,2 +57,2 @@ #map = new Map()

module.exports = {UrlPattern}
module.exports = { UrlPattern }

@@ -0,34 +1,46 @@

## 4.19.0
- Add CDP for Chrome 123 and remove 120
- [bidi] Add browser module (#13677)
- [bidi] Add storage module (#13684)
- [bidi] Add fail request command
- [bidi] Add error handling to check BytesValue instance
- [bidi] Add continueRequest and continueResponse command (#13704)
- [bidi] Add provide response command (#13708)
- [bidi] Add setFiles command of the Input Module (#13711)
- [atoms] use css locators in dom.js (#13430)
## 4.18.1
* Add CDP for Chrome 122 and remove 119
- Add CDP for Chrome 122 and remove 119
## 4.18.0
* Fix running the casting related methods in chromium (#13479)
* [bidi] Add browsing context destroyed event
* [bidi] Add realm destroyed event
* [bidi] Add locate node command (#13489)
* [bidi] Deprecate NetworkInspector in favor of Network
* Make `npm run lint` pass for javascript/node/selenium-webdriver (#13560)
* [bidi] Add "addintercept" and "removeintercept" commands (#13564)
* [bidi] Add auth related commands (#13572)
* [bidi] Add 'continueWithAuth' command
* [bidi] Add 'fetchError' command
- Fix running the casting related methods in chromium (#13479)
- [bidi] Add browsing context destroyed event
- [bidi] Add realm destroyed event
- [bidi] Add locate node command (#13489)
- [bidi] Deprecate NetworkInspector in favor of Network
- Make `npm run lint` pass for javascript/node/selenium-webdriver (#13560)
- [bidi] Add "addintercept" and "removeintercept" commands (#13564)
- [bidi] Add auth related commands (#13572)
- [bidi] Add 'continueWithAuth' command
- [bidi] Add 'fetchError' command
## 4.17.0
* Add javascript to Selenium Manager input for tracking (see #13288)
* remove deprecated headless methods and associated references
* Add script message event (#13153)
* Update channel name from Aurora to Dev
* Remove firefox_channels.js example as Channels is deprecated
* Add Input module command (#13360)
* remove all references to firefox-bin
* download files from remote server (#13102)
* Add auth required event
* Add traverse history command
* Add test to get iframe's browsing context
* Add Input module JS command
* Add test for node properties in
* Add CDP for Chrome 121 and remove 118
- Add javascript to Selenium Manager input for tracking (see #13288)
- remove deprecated headless methods and associated references
- Add script message event (#13153)
- Update channel name from Aurora to Dev
- Remove firefox_channels.js example as Channels is deprecated
- Add Input module command (#13360)
- remove all references to firefox-bin
- download files from remote server (#13102)
- Add auth required event
- Add traverse history command
- Add test to get iframe's browsing context
- Add Input module JS command
- Add test for node properties in
- Add CDP for Chrome 121 and remove 118

@@ -39,8 +51,8 @@ ## 4.16.0

* Fix logging levels in http.js and webdriver.js (#13098)
* Remove unused targets from the JS tree (#13129)
- Fix logging levels in http.js and webdriver.js (#13098)
- Remove unused targets from the JS tree (#13129)
* #### :nail_care: Polish
- #### :nail_care: Polish
* Add CDP v120 and remove v117
- Add CDP v120 and remove v117

@@ -51,13 +63,14 @@ ## 4.15.0

* Replace calls to console.log with managed loggers (#12909)
- Replace calls to console.log with managed loggers (#12909)
#### :nail_care: Polish
* Add CDP v119 and remove v116
- Add CDP v119 and remove v116
#### :rocket: New Feature
* Add BiDi captureScreenshot command (#12510)
* Add BiDi browsing context activate command, handle user prompt command and reload command
* Add BiDi browsing context commands and events (#13078)
- Add BiDi captureScreenshot command (#12510)
- Add BiDi browsing context activate command, handle user prompt command and
reload command
- Add BiDi browsing context commands and events (#13078)

@@ -68,3 +81,3 @@ ## 4.14.0

* Adding CDP v118 and removing v115
- Adding CDP v118 and removing v115

@@ -75,8 +88,8 @@ ## 4.13.0

* Adding CDP v117 and removing v114
* Added file location to exception message for Selenium Manager
- Adding CDP v117 and removing v114
- Added file location to exception message for Selenium Manager
#### :rocket: New Feature
* Allow users to set Selenium Manager path by environment variable (#12752)
- Allow users to set Selenium Manager path by environment variable (#12752)

@@ -87,10 +100,10 @@ ## 4.12.0

* Adding browsers when they are present on the host (#12456)
* Create absolute path for browser binary (#12479)
* Fix how browsers and drivers are discovered (#12456)
- Adding browsers when they are present on the host (#12456)
- Create absolute path for browser binary (#12479)
- Fix how browsers and drivers are discovered (#12456)
#### :nail_care: Polish
* Add support for Chrome 116 and remove support for Chrome 113
* Remove browserVersion from options in Selenium Manager (#12641)
- Add support for Chrome 116 and remove support for Chrome 113
- Remove browserVersion from options in Selenium Manager (#12641)

@@ -101,3 +114,3 @@ ## 4.11.1

* Update testing/index.js code snippet to fix function call (#12456)
- Update testing/index.js code snippet to fix function call (#12456)

@@ -108,23 +121,24 @@ ## v4.11.0

* [BiDi] fix addPreloadScript failing tests (#12182)
* Print debug message once for each browser when selenium manager used
* Add forgotten RelativeBy in check options (#12289)
* SM supports all browsers in Selenium since a while ago
* Using SM to check drivers on the PATH
* Display info about SM activity
* Removing logic to find drivers, delegating to Selenium Manager
* Removing service parameter from getPath
* add support for Chrome 115 and remove support for Chrome 112
* Update webdriver-bootstrap.js (#12276)
- [BiDi] fix addPreloadScript failing tests (#12182)
- Print debug message once for each browser when selenium manager used
- Add forgotten RelativeBy in check options (#12289)
- SM supports all browsers in Selenium since a while ago
- Using SM to check drivers on the PATH
- Display info about SM activity
- Removing logic to find drivers, delegating to Selenium Manager
- Removing service parameter from getPath
- add support for Chrome 115 and remove support for Chrome 112
- Update webdriver-bootstrap.js (#12276)
#### :rocket: New Feature
* [BiDi] add Network module events (#12197)
* Adding ignore process match for IE Mode across bindings (#12279)
* Add browser output from Selenium Manager to options (#12411)
- [BiDi] add Network module events (#12197)
- Adding ignore process match for IE Mode across bindings (#12279)
- Add browser output from Selenium Manager to options (#12411)
#### :bug: Bug Fix
* fix SeleniumServer.start() crashes on MacOS with nodejs selenium-webdriver (#12158)
* Update by.js: Add forgotten RelativeBy in check options (#12289)
- fix SeleniumServer.start() crashes on MacOS with nodejs selenium-webdriver (
#12158)
- Update by.js: Add forgotten RelativeBy in check options (#12289)

@@ -135,10 +149,10 @@ ## v4.10.0

* Adding CDP v114 and removing v111
- Adding CDP v114 and removing v111
#### :rocket: New Feature
* [Edge] Support webview2 (#11978)
* [BiDi] Add Script module commands to add/remove preloaded scripts (#11847)
* [BiDi] Add printPage command (#12124)
* Add support for proxies with Selenium Manager
- [Edge] Support webview2 (#11978)
- [BiDi] Add Script module commands to add/remove preloaded scripts (#11847)
- [BiDi] Add printPage command (#12124)
- Add support for proxies with Selenium Manager

@@ -149,3 +163,3 @@ ## v4.9.2

* Handle rejection of the driver if not found
- Handle rejection of the driver if not found

@@ -156,3 +170,3 @@ ## v4.9.1

* Add CDP files for v113 and remove v110
- Add CDP files for v113 and remove v110

@@ -163,15 +177,15 @@ ## v4.9.0

* Adding CDP v112 and removing v109
- Adding CDP v112 and removing v109
#### :bug: Bug Fix
* Fix: return statement in submit() (#11883)
* [grid] Refining the UI configuration to allow sub paths work properly.
* Replace `execSync` with `spawnSync` in `seleniumManager.js` (#11649) (#11873)
- Fix: return statement in submit() (#11883)
- [grid] Refining the UI configuration to allow sub paths work properly.
- Replace `execSync` with `spawnSync` in `seleniumManager.js` (#11649) (#11873)
#### :rocket: New Feature
* [BiDi] Add Script module commands and types (#11847)
* Selenium Manager get Browser Version from Options classes
* Selenium Manager use binary from Browser Options
- [BiDi] Add Script module commands and types (#11847)
- Selenium Manager get Browser Version from Options classes
- Selenium Manager use binary from Browser Options

@@ -182,8 +196,8 @@ ## v4.8.2

* Add CDP support for v111 and remove v108
* Using json output with Selenium Manager
- Add CDP support for v111 and remove v108
- Using json output with Selenium Manager
#### :bug: Bug Fix
* fix: Using status from response (#11742)
- fix: Using status from response (#11742)

@@ -194,8 +208,8 @@ ## v4.8.1

* Add script pinning (#11584)
- Add script pinning (#11584)
#### :nail_care: Polish
* Add CDP support for v110 and remove v107
* Updating Selenium Manager binaries for 4.8.1 release
- Add CDP support for v110 and remove v107
- Updating Selenium Manager binaries for 4.8.1 release

@@ -210,13 +224,13 @@ #### :bug: Bug Fix

* Add initial BiDi Support (#11395)
* Add window wrappers getSize and setSize
* Add BiDi browser context commands (#11473)
* Add BiDi methods to listen to js logs and any type of logs
* Add BiDi filtering capability to LogInspector (#11495)
* Add comment with name of large JS executions (#11038)
- Add initial BiDi Support (#11395)
- Add window wrappers getSize and setSize
- Add BiDi browser context commands (#11473)
- Add BiDi methods to listen to js logs and any type of logs
- Add BiDi filtering capability to LogInspector (#11495)
- Add comment with name of large JS executions (#11038)
#### :nail_care: Polish
* Add CDP support for v109 and remove v106
* Deprecate setHeadless() in Chrome and Firefox (#11467)
- Add CDP support for v109 and remove v106
- Deprecate setHeadless() in Chrome and Firefox (#11467)

@@ -227,11 +241,11 @@ ## v4.7.1

* feat/deprecation message for standalone3x (#11422)
- feat/deprecation message for standalone3x (#11422)
#### :bug: Bug Fix
* feat/fix spawn format for SeleniumServer, issue 11405 (#11412)
- feat/fix spawn format for SeleniumServer, issue 11405 (#11412)
#### Committers: 1
* Potapov Dmitriy ([@potapovDim](https://github.com/potapovDim))
- Potapov Dmitriy ([@potapovDim](https://github.com/potapovDim))

@@ -242,8 +256,8 @@ ## v4.7.0

* Add support for Selenium Manager to work with IE Driver
- Add support for Selenium Manager to work with IE Driver
#### :nail_care: Polish
* Adding CDP files for v108 and removing v105
* Improve error handling for Selenium Manager
- Adding CDP files for v108 and removing v105
- Improve error handling for Selenium Manager

@@ -254,7 +268,7 @@ ## v4.6.1

* Support Node 17 and above (#11262)
- Support Node 17 and above (#11262)
#### :nail_care: Polish
* Fix typos (#11258)
- Fix typos (#11258)

@@ -265,15 +279,15 @@ ## v4.6.0

* [grid] Add ability to use Enter key to confirm (#11178)
* [grid][ui] Add search field for running sessions (#11197)
* Add support for selenium manager (#11189)
- [grid] Add ability to use Enter key to confirm (#11178)
- [grid][ui] Add search field for running sessions (#11197)
- Add support for selenium manager (#11189)
#### :bug: Bug Fix
* isPromise() thenable fix (#11048)
* Fix: making methods static (#11182)
- isPromise() thenable fix (#11048)
- Fix: making methods static (#11182)
#### :nail_care: Polish
* fix a tiny typo in chromium.js (#11073)
* Adding CDP files for v107 and removing v104
- fix a tiny typo in chromium.js (#11073)
- Adding CDP files for v107 and removing v104

@@ -284,205 +298,215 @@ ## v4.5.0

* Adds 'Select' support package
* selectByIndex
* selectByValue
* selectByVisibleText
* getAllSelectedOptions
* getFirstSelectedOption
* deselectAll
* deselectByVisibleText
* deselectByIndex
* deselectByValue
* Add support for Actions API sendKeys to designated element
* Adds mouse button enum for forward and backward navigation
- Adds 'Select' support package
- selectByIndex
- selectByValue
- selectByVisibleText
- getAllSelectedOptions
- getFirstSelectedOption
- deselectAll
- deselectByVisibleText
- deselectByIndex
- deselectByValue
- Add support for Actions API sendKeys to designated element
- Adds mouse button enum for forward and backward navigation
#### :bug: Bug Fix
* Set min node support to 14.x.x (issue 1 in #10970)
* fix: geckodriver session with node 18.x.x (issue 2 in #10970)
* fix: JS firefox driver crashes on setting a profile (fixed
- Set min node support to 14.x.x (issue 1 in #10970)
- fix: geckodriver session with node 18.x.x (issue 2 in #10970)
- fix: JS firefox driver crashes on setting a profile (fixed
with [commit](https://github.com/SeleniumHQ/selenium/commit/fa6deeea6bda1e73317157845772e114bd569b7d))
* fix: "SetExperimental" option is not available in webdriverjs (Javascript/Typescript) (#10959)
* fix: Do not allow Select class to select disabled options (#10812)
- fix: "SetExperimental" option is not available in webdriverjs (
Javascript/Typescript) (#10959)
- fix: Do not allow Select class to select disabled options (#10812)
#### :nail_care: Polish
* Stop sending desiredCapabilities to local end and remote end
* tests: Quit driver instance after each test
* tests: Adds select by multiple(index,value, text) tests
* chore/code style changes, add util (#10975)
* chore/code style changes to common format (#10964)
* destructuring exports
* Moving from static to const to make js-dossier happy
* Removing circular dependency Between webdriver.js and http.js
* fix some typos in code and documentation
* add cdp v105 remove v102
* add cdp v106 remove v103
- Stop sending desiredCapabilities to local end and remote end
- tests: Quit driver instance after each test
- tests: Adds select by multiple(index,value, text) tests
- chore/code style changes, add util (#10975)
- chore/code style changes to common format (#10964)
- destructuring exports
- Moving from static to const to make js-dossier happy
- Removing circular dependency Between webdriver.js and http.js
- fix some typos in code and documentation
- add cdp v105 remove v102
- add cdp v106 remove v103
## v4.4.0
* Add support CDP 104 and remove CDP 101
- Add support CDP 104 and remove CDP 101
## v4.3.1
* create new default service for every driver instance in chromium (#10796)
* Updated jsdoc for move action (#10816)
- create new default service for every driver instance in chromium (#10796)
- Updated jsdoc for move action (#10816)
## v4.3.0
* Fix: using fulfillRequest when intercepting (#10764)
* Add support CDP 103 and remove CDP 100
* Remove unused param in input.js & minor code cleanup
* Fixes lint issues and updates npm packages
* feat: Added virtual authenticator (#10663)
- Fix: using fulfillRequest when intercepting (#10764)
- Add support CDP 103 and remove CDP 100
- Remove unused param in input.js & minor code cleanup
- Fixes lint issues and updates npm packages
- feat: Added virtual authenticator (#10663)
## v4.2.0
* Delete old android-driver
* Remove Opera support from JS bindings #10379
* Handle a breaking changes in os.networkInterfaces (#10611)
* Add support to switch frame by id
* Add support to switch frame by name (#10670)
* [cdp] add support Chrome 102 and remove for Chrome 98
* Update implementation for submitting forms
- Delete old android-driver
- Remove Opera support from JS bindings #10379
- Handle a breaking changes in os.networkInterfaces (#10611)
- Add support to switch frame by id
- Add support to switch frame by name (#10670)
- [cdp] add support Chrome 102 and remove for Chrome 98
- Update implementation for submitting forms
## v4.1.2
* chore/connect to CDP based on ENV selenium address var (#10255)
* Add wheel support to actions
* add support for Chrome 98 and remove support for Chrome 95
* add deleteNetworkConditions for chromium (#10323)
* Add new pointer attributes to actions
* add support Chrome 99 and remove for Chrome 96
* sendKeys error message fixed
* add support Chrome 100 and remove for Chrome 97
* removing onQuit handler for chromedriver (#10499)
* Split String on grapheme pairs in sendKeys command (#10519)
* do not convert tag name to css selector
* docs: use Browser constants for browser name (#10567)
- chore/connect to CDP based on ENV selenium address var (#10255)
- Add wheel support to actions
- add support for Chrome 98 and remove support for Chrome 95
- add deleteNetworkConditions for chromium (#10323)
- Add new pointer attributes to actions
- add support Chrome 99 and remove for Chrome 96
- sendKeys error message fixed
- add support Chrome 100 and remove for Chrome 97
- removing onQuit handler for chromedriver (#10499)
- Split String on grapheme pairs in sendKeys command (#10519)
- do not convert tag name to css selector
- docs: use Browser constants for browser name (#10567)
## v4.1.1
* Add support for installing unpacked addons at runtime in Firefox webdriver (#10216)
* Enables firefox debugger for devtools test
* Sets correct browserName when set via SELENIUM_BROWSER fixes #10218
* add support for Chrome v97
* Adds new desktop cast command for Chromium #10190 (#10191)
* ignore errors arising from trying to use file detector fixes #6343
* Added RelativeBy class on the main api (#10148)
* Code cleanup and minor improvements
* Implements 'getDomAttribute' to get attribute value as defined by w3c spec and removes legacy
- Add support for installing unpacked addons at runtime in Firefox webdriver (
#10216)
- Enables firefox debugger for devtools test
- Sets correct browserName when set via SELENIUM_BROWSER fixes #10218
- add support for Chrome v97
- Adds new desktop cast command for Chromium #10190 (#10191)
- ignore errors arising from trying to use file detector fixes #6343
- Added RelativeBy class on the main api (#10148)
- Code cleanup and minor improvements
- Implements 'getDomAttribute' to get attribute value as defined by w3c spec and
removes legacy
command usages
* Remove legacy JWP support and w3c<boolean> switch (#10095)
* update map/filter clean up to common format (#10094)
- Remove legacy JWP support and w3c<boolean> switch (#10095)
- update map/filter clean up to common format (#10094)
## v4.1.0
* add support for handling Shadow DOM elements
* Capture browser console logs when using BiDi onLogEvent api
* add CDP support for v96 and remove v93
* remove useless package, change io public api import to more common approach (#10037)
* Fix flaky CDP dom mutation (#10029)
* Fix edge test failures (#10012)
* code cleanup second iteration (#9979)
* Ensure correct serialization of extensions in chromium.Options (#6676)
* Remove explicit id passing for CDP commands
* Attach to page target while creating a CDP connection (#10005)
* Add support for form submit in W3C mode (fixes #9916) (#9936)
* Fixes relative locator 'locateWith' export
* update doc string for CDP Commands (#9929)
- add support for handling Shadow DOM elements
- Capture browser console logs when using BiDi onLogEvent api
- add CDP support for v96 and remove v93
- remove useless package, change io public api import to more common approach (
#10037)
- Fix flaky CDP dom mutation (#10029)
- Fix edge test failures (#10012)
- code cleanup second iteration (#9979)
- Ensure correct serialization of extensions in chromium.Options (#6676)
- Remove explicit id passing for CDP commands
- Attach to page target while creating a CDP connection (#10005)
- Add support for form submit in W3C mode (fixes #9916) (#9936)
- Fixes relative locator 'locateWith' export
- update doc string for CDP Commands (#9929)
## v4.0.0
* Fixes cdp for Chrome and Firefox (#9909)
* Add cdp 95 to python and JS
* Removing unused target for cdpConnection
- Fixes cdp for Chrome and Firefox (#9909)
- Add cdp 95 to python and JS
- Removing unused target for cdpConnection
## v4.0.0-rc-2
* Fix builder test
* Allow builder to set a single arbitrary capability (#9857)
* Restore withCapabilities() to ensure backward compatibility
* Add new websocketUrl capability
* update ruby, python and JS to add support for v94 and remove support for v92
* Add a check for Grid CDP endpoint
* Implement network request interceptions
* Update connections to devtools so it works in Firefox and Chrome
- Fix builder test
- Allow builder to set a single arbitrary capability (#9857)
- Restore withCapabilities() to ensure backward compatibility
- Add new websocketUrl capability
- update ruby, python and JS to add support for v94 and remove support for v92
- Add a check for Grid CDP endpoint
- Implement network request interceptions
- Update connections to devtools so it works in Firefox and Chrome
## v4.0.0-rc-1
* Deprecates withCapabilities method and removes tests (#9701)
* expose `withLocator` method at the top level
* Enables Mobile feature for Firefox (Still need to expand this to chromium based browsers)
- Deprecates withCapabilities method and removes tests (#9701)
- expose `withLocator` method at the top level
- Enables Mobile feature for Firefox (Still need to expand this to chromium
based browsers)
* Add the ability to do Relative Locators with all By types. Fixes #9559
* Add default Opera capabilities. Fixes #9654
* Add support for ChromeDriver `--enable-chrome-logs` (#9575) [Author: Mark Stacey]
- Add the ability to do Relative Locators with all By types. Fixes #9559
- Add default Opera capabilities. Fixes #9654
- Add support for ChromeDriver `--enable-chrome-logs` (
#9575) [Author: Mark Stacey]
The `--enable-chrome-logs` ChromeDriver option can now be enabled using the Chromium (or Chrome)
The `--enable-chrome-logs` ChromeDriver option can now be enabled using the
Chromium (or Chrome)
ServiceBuilder, similarly to the other options provided by ChromeDriver.
* Add the debuggerAddress option to chromium.js (#9561) [Author: Brandon Walderman]
* Adds http client options [#9638](Author: Dharin Shah)
* Updating edge.js to extend chromium.driver (fixes #9626)
- Add the debuggerAddress option to chromium.js (
#9561) [Author: Brandon Walderman]
- Adds http client options [#9638](Author: Dharin Shah)
- Updating edge.js to extend chromium.driver (fixes #9626)
## v4.0.0-beta.4
* Add windowTypes option support for ChromiumDriver (#7897)
* Allow relativeby with findElement (#9396)
- Add windowTypes option support for ChromiumDriver (#7897)
- Allow relativeby with findElement (#9396)
## v4.0.0-beta.3
* Removed support for legacy actions. This will also remove "Bride Mode" support, which was
- Removed support for legacy actions. This will also remove "Bride Mode"
support, which was
introduced to translate of action class to legacy API.
* Remove devtools support for v86,v87 and adding support for v89, v90, v91
* make isPromise() return boolean value for null and undefined cases (#6785)
* code cleanup (#9158)
* replacing asserts equal with strictEqual and deepEqual with deepStrictEqual
- Remove devtools support for v86,v87 and adding support for v89, v90, v91
- make isPromise() return boolean value for null and undefined cases (#6785)
- code cleanup (#9158)
- replacing asserts equal with strictEqual and deepEqual with deepStrictEqual
## v4.0.0-beta.2
* Removed support for Edge legacy.
* Make the build silent for WebDriver Bidi generated code
* resolve file path correctly (#9223)
* Update example in edge.js (#9231)
* Use a flat namespace for selenium options for finding WebDriver Bidi endpoint
* Removing duplicate license text updated by update_copyright.js
* Updating copyright text
* Minor code cleanup
* Removing duplicate variable declaration of IE from capabilities
- Removed support for Edge legacy.
- Make the build silent for WebDriver Bidi generated code
- resolve file path correctly (#9223)
- Update example in edge.js (#9231)
- Use a flat namespace for selenium options for finding WebDriver Bidi endpoint
- Removing duplicate license text updated by update_copyright.js
- Updating copyright text
- Minor code cleanup
- Removing duplicate variable declaration of IE from capabilities
## v4.0.0-beta.1
* JS Binding support for WebDriver Bidi in Firefox
* This requires Firefox 87 and Geckodriver 0.29 to be able to work
* Update the supported CDP versions
* Update tmp package version (#9155)
* Adding support for /computedlabel (getAccessibleName) (#9073)
* Adding support for computedrole (#8990)
* Use subfolder for NPM package homepage (#8938)
* Fix typo: tracingCategories -> traceCategories (#8976)
* Package up mutation-listener for node. Fixes #8955
* Adding support for `print` endpoint (#8880)
- JS Binding support for WebDriver Bidi in Firefox
- This requires Firefox 87 and Geckodriver 0.29 to be able to work
- Update the supported CDP versions
- Update tmp package version (#9155)
- Adding support for /computedlabel (getAccessibleName) (#9073)
- Adding support for computedrole (#8990)
- Use subfolder for NPM package homepage (#8938)
- Fix typo: tracingCategories -> traceCategories (#8976)
- Package up mutation-listener for node. Fixes #8955
- Adding support for `print` endpoint (#8880)
## v4.0.0-alpha.8
* Rolling back native support for Opera Browser
* Added new ieOptions capabilities:
* fileUploadDialogTimeout
* setEdgePath
* setEdgeChromium
* setScrollBehavior
* For consistent naming, deprecating `addArguments(...args)` in favor
of `addBrowserCommandSwitches(...args)`
- Rolling back native support for Opera Browser
- Added new ieOptions capabilities:
* Added relative locators
* Added Chrome DevTools Protocol (CDP) support
* Added support for BASIC authentication.
* Added listener for DOM mutations.
* Added support for listening out for console log events.
* Added support listening js exceptions using CDP
- fileUploadDialogTimeout
- setEdgePath
- setEdgeChromium
- setScrollBehavior
- For consistent naming, deprecating `addArguments(...args)` in favor
of `addBrowserCommandSwitches(...args)`
- Added relative locators
- Added Chrome DevTools Protocol (CDP) support
- Added support for BASIC authentication.
- Added listener for DOM mutations.
- Added support for listening out for console log events.
- Added support listening js exceptions using CDP
### API Changes
* Added the 'opera' module
- Added the 'opera' module

@@ -493,3 +517,3 @@ ## v4.0.0-alpha.4

* Removed BUILD.bazel files from the build artifact
- Removed BUILD.bazel files from the build artifact

@@ -500,14 +524,14 @@ ## v4.0.0-alpha.3

* The minimum supported version of Node is now 10.15.0 LTS
- The minimum supported version of Node is now 10.15.0 LTS
### Changes
* add `pollTimeout` argument to the `wait()` method. Default value is `200`ms
* add `switchTo().parentFrame()` for non-W3C compatible drivers
* add support for opening a new window
- add `pollTimeout` argument to the `wait()` method. Default value is `200`ms
- add `switchTo().parentFrame()` for non-W3C compatible drivers
- add support for opening a new window
### API Changes
* Export `lib/input.Origin` from the top level `selenium-webdriver` module.
* HTTP requests from this library will now include a User-Agent of the form
- Export `lib/input.Origin` from the top level `selenium-webdriver` module.
- HTTP requests from this library will now include a User-Agent of the form
`selenium/${VERSION} (js ${PLATFORM})`.

@@ -519,3 +543,3 @@

* The minimum supported version of Node is now 8.9.0 LTS
- The minimum supported version of Node is now 8.9.0 LTS

@@ -534,19 +558,26 @@ ### Changes to Supported Browsers

* Revamped the actions API to conform with the WebDriver Spec:
<https://www.w3.org/TR/webdriver/#actions>. For details, refer to the JS doc on
- Revamped the actions API to conform with the WebDriver Spec:
<https://www.w3.org/TR/webdriver/#actions>. For details, refer to the JS doc
on
the `lib/input.Actions` class.
As of January, 2018, only Firefox natively supports this new API. You can put the `Actions` class
into "bridge mode" and it will attempt to translate mouse and keyboard actions to the legacy API (
see class docs). Alternatively, you may continue to use the legacy API directly via
As of January, 2018, only Firefox natively supports this new API. You can put
the `Actions` class
into "bridge mode" and it will attempt to translate mouse and keyboard actions
to the legacy API (
see class docs). Alternatively, you may continue to use the legacy API
directly via
the `lib/actions` module.
__NOTE:__ The legacy API is considered strongly deprecated and will be removed in a minor release
**NOTE:** The legacy API is considered strongly deprecated and will be removed
in a minor release
once Google's Chrome and Microsoft's Edge browsers support the new API.
* All window manipulation commands are now supported.
* Added `driver.switchTo().parentFrame()`
* When a named cookie is requested, attempt to fetch it directly using the W3C
endpoint, `GET /session/{session id}/cookie/{name}`. If this command is not recognized by the
remote end, fallback to fetching all cookies and then searching for the desired name.
* Replaced `WebElement.getSize()` and `WebElement.getLocation()` with a single
- All window manipulation commands are now supported.
- Added `driver.switchTo().parentFrame()`
- When a named cookie is requested, attempt to fetch it directly using the W3C
endpoint, `GET /session/{session id}/cookie/{name}`. If this command is not
recognized by the
remote end, fallback to fetching all cookies and then searching for the
desired name.
- Replaced `WebElement.getSize()` and `WebElement.getLocation()` with a single
method, `WebElement.getRect()`.

@@ -556,136 +587,147 @@

* The core WebDriver API no longer uses promise manager
* Removed `index.Builder#setControlFlow()`
* The following thenable types no longer have a `cancel()` method:
* The dynamically generated thenable WebDrivers created by `index.Builder`
* `lib/webdriver.AlertPromise`
* `lib/webdriver.WebElementPromise`
* Removed `remote/index.DriverService.prototype.stop()` (use `#kill()` instead)
* Removed the `lib/actions` module
* Removed the `lib/events` module
* Removed the `phantomjs` module
* Removed the 'opera' module
* Removed the promise manager from `lib/promise`, which includes the removal of the following
- The core WebDriver API no longer uses promise manager
- Removed `index.Builder#setControlFlow()`
- The following thenable types no longer have a `cancel()` method:
- The dynamically generated thenable WebDrivers created by `index.Builder`
- `lib/webdriver.AlertPromise`
- `lib/webdriver.WebElementPromise`
- Removed `remote/index.DriverService.prototype.stop()` (use `#kill()` instead)
- Removed the `lib/actions` module
- Removed the `lib/events` module
- Removed the `phantomjs` module
- Removed the 'opera' module
- Removed the promise manager from `lib/promise`, which includes the removal of
the following
exported names (replacements, if any, in parentheses):
* CancellableThenable
* CancellationError
* ControlFlow
* Deferred
* LONG_STACK_TRACES
* MultipleUnhandledRejectionError
* Promise (use native Promises)
* Resolver
* Scheduler
* Thenable
* USE_PROMISE_MANAGER
* all (use Promise.all)
* asap (use Promise.resolve)
* captureStackTrace (use Error.captureStackTrace)
* consume (use async functions)
* controlFlow
* createPromise (use new Promise)
* defer
* fulfilled (use Promise.resolve)
* isGenerator
* rejected (use Promise.reject)
* setDefaultFlow
* when (use Promise.resolve)
* Changes to the `Builder` class:
* Added setChromeService, setEdgeService, & setFirefoxService
* Removed setEnableNativeEvents
* Removed setScrollBehavior
* Changes to `chrome.Driver`
* Added sendDevToolsCommand
* Added setDownloadPath
* Changes to `chrome.Options`
* Now extends the `Capabilities` class
* Removed from/toCapabilities
* Changes to `edge.Options`
* Now extends the `Capabilities` class
* Removed from/toCapabilities
* Changes to `ie.Options`
* Now extends the `Capabilities` class
* Removed from/toCapabilities
* Removed the `firefox.Binary` class. Custom binaries can still be selected
using `firefox.Options#setBinary()`. Likewise, custom binary arguments can be specified
- CancellableThenable
- CancellationError
- ControlFlow
- Deferred
- LONG_STACK_TRACES
- MultipleUnhandledRejectionError
- Promise (use native Promises)
- Resolver
- Scheduler
- Thenable
- USE_PROMISE_MANAGER
- all (use Promise.all)
- asap (use Promise.resolve)
- captureStackTrace (use Error.captureStackTrace)
- consume (use async functions)
- controlFlow
- createPromise (use new Promise)
- defer
- fulfilled (use Promise.resolve)
- isGenerator
- rejected (use Promise.reject)
- setDefaultFlow
- when (use Promise.resolve)
- Changes to the `Builder` class:
- Added setChromeService, setEdgeService, & setFirefoxService
- Removed setEnableNativeEvents
- Removed setScrollBehavior
- Changes to `chrome.Driver`
- Added sendDevToolsCommand
- Added setDownloadPath
- Changes to `chrome.Options`
- Now extends the `Capabilities` class
- Removed from/toCapabilities
- Changes to `edge.Options`
- Now extends the `Capabilities` class
- Removed from/toCapabilities
- Changes to `ie.Options`
- Now extends the `Capabilities` class
- Removed from/toCapabilities
- Removed the `firefox.Binary` class. Custom binaries can still be selected
using `firefox.Options#setBinary()`. Likewise, custom binary arguments can be
specified
with `firefox.Options#addArguments()`.
* Changes to `firefox.Driver`
* Added installAddon(path)
* Added uninstallAddon(id)
* Changes to `firefox.Options`
* Now extends the `Capabilities` class
* Removed from/toCapabilities
* Removed setLoggingPreferences (was a no-op)
* setProfile now only accepts a path to an existing profile
* Added addExtensions
* Added setPreference
* Removed the `firefox.Profile` class. All of its functionality is now provided directly
- Changes to `firefox.Driver`
- Added installAddon(path)
- Added uninstallAddon(id)
- Changes to `firefox.Options`
- Now extends the `Capabilities` class
- Removed from/toCapabilities
- Removed setLoggingPreferences (was a no-op)
- setProfile now only accepts a path to an existing profile
- Added addExtensions
- Added setPreference
- Removed the `firefox.Profile` class. All of its functionality is now provided
directly
by `firefox.Options`
* Removed the `firefox/binary` module
* Removed the `firefox/profile` module
* Changes to `safari.Options`
* Now extends the `Capabilities` class
* Removed from/toCapabilities
* Removed setCleanSession (was a no-op)
* Changes to `lib/capabilities.Browser`:
* Removed several enum values.
* ANDROID (use Chrome for Android; see docs on the chrome module)
* IPAD (no support available)
* IPHONE (no support available)
* OPERA (use Chrome)
* PHANTOM_JS (use Chrome or Firefox in headless mode)
* HTMLUNIT (use Chrome or Firefox in headless mode)
* Changes to `lib/capabilities.Capabilities`:
* Removed static factory methods android(), ipad(), iphone(), opera(), phantomjs(), htmlunit(),
and htmlunitwithjs(). Users can still manually configure capabilities for these, but their use
is not recommended and they will no longer be surfaced in the API.
* Changes to `lib/error`:
* Added
* ElementClickInterceptedError
* InsecureCertificateError
* InvalidCoordinatesError
* NoSuchCookieError
* Removed
* ElementNotVisibleError
* InvalidElementCoordinatesError
* Changes to `lib/webdriver.WebDriver`:
* Dropped support for "requiredCapabilities" from WebDriver.createSession
* actions() now returns the new `lib/input.Actions` class
* Removed touchActions
* Renamed schedule to execute
* Removed the `WebDriver.attachToSession()` factory method. Users can just the `WebDriver`
constructor directly instead.
* Removed the `call()` method. This was used to inject custom function calls into the control
flow. Now that the promise manager is no longer used, this method is no longer necessary.
Users are now responsible for coordinating actions (ideally with async functions) and can just
call functions directly instead of through `driver.call()`.
* Changes to `lib/webdriver.WebElement`:
* Replaced getSize & getLocation with getRect
* Changes to `lib/webdriver.Alert`:
* Removed authenticateAs
* Changes to `lib/webdriver.Options` (`driver.manage()`):
* Removed timeouts (use get/setTimeouts)
* Changes to `lib/webdriver.Window` (`driver.manage().window()`):
* Added
* getRect
* setRect
* fullscreen
* minimize
* Removed (use the getRect/setRect methods)
* getPosition
* setPosition
* getSize
* setSize
* Removed the `testing/assert` module
* Changes to `testing/index`
* Since the promise manager has been removed, it is no longer necessary to wrap the Mocha test
hooks; instead, users can simply use async functions. The following have all been removed:
* describe
* before
* beforeEach
* after
* afterEach
* it
* Added the `suite` function. For details, refer to the jsdoc or
`example/google_search_test.js`
- Removed the `firefox/binary` module
- Removed the `firefox/profile` module
- Changes to `safari.Options`
- Now extends the `Capabilities` class
- Removed from/toCapabilities
- Removed setCleanSession (was a no-op)
- Changes to `lib/capabilities.Browser`:
- Removed several enum values.
- ANDROID (use Chrome for Android; see docs on the chrome module)
- IPAD (no support available)
- IPHONE (no support available)
- OPERA (use Chrome)
- PHANTOM_JS (use Chrome or Firefox in headless mode)
- HTMLUNIT (use Chrome or Firefox in headless mode)
- Changes to `lib/capabilities.Capabilities`:
- Removed static factory methods android(), ipad(), iphone(), opera(),
phantomjs(), htmlunit(),
and htmlunitwithjs(). Users can still manually configure capabilities for
these, but their use
is not recommended and they will no longer be surfaced in the API.
- Changes to `lib/error`:
- Added
- ElementClickInterceptedError
- InsecureCertificateError
- InvalidCoordinatesError
- NoSuchCookieError
- Removed
- ElementNotVisibleError
- InvalidElementCoordinatesError
- Changes to `lib/webdriver.WebDriver`:
- Dropped support for "requiredCapabilities" from WebDriver.createSession
- actions() now returns the new `lib/input.Actions` class
- Removed touchActions
- Renamed schedule to execute
- Removed the `WebDriver.attachToSession()` factory method. Users can just
the `WebDriver`
constructor directly instead.
- Removed the `call()` method. This was used to inject custom function calls
into the control
flow. Now that the promise manager is no longer used, this method is no
longer necessary.
Users are now responsible for coordinating actions (ideally with async
functions) and can just
call functions directly instead of through `driver.call()`.
- Changes to `lib/webdriver.WebElement`:
- Replaced getSize & getLocation with getRect
- Changes to `lib/webdriver.Alert`:
- Removed authenticateAs
- Changes to `lib/webdriver.Options` (`driver.manage()`):
- Removed timeouts (use get/setTimeouts)
- Changes to `lib/webdriver.Window` (`driver.manage().window()`):
- Added
- getRect
- setRect
- fullscreen
- minimize
- Removed (use the getRect/setRect methods)
- getPosition
- setPosition
- getSize
- setSize
- Removed the `testing/assert` module
- Changes to `testing/index`
- Since the promise manager has been removed, it is no longer necessary to
wrap the Mocha test
hooks; instead, users can simply use async functions. The following have all
been removed:
- describe
- before
- beforeEach
- after
- afterEach
- it
- Added the `suite` function. For details, refer to the jsdoc or
`example/google_search_test.js`

@@ -696,7 +738,10 @@ ## v3.6.0

* The Capabilities factory methods should only specify the name of the browser.
* Protect against the remote end sometimes not returning a list to findElements commands.
* Properly reset state in `remote.DriverService#kill()`
* The firefox module will no longer apply the preferences required by the legacy FirefoxDriver.
These preferences were only required when using the legacy driver, support for which was dropped
- The Capabilities factory methods should only specify the name of the browser.
- Protect against the remote end sometimes not returning a list to findElements
commands.
- Properly reset state in `remote.DriverService#kill()`
- The firefox module will no longer apply the preferences required by the legacy
FirefoxDriver.
These preferences were only required when using the legacy driver, support for
which was dropped
in v3.5.0.

@@ -706,18 +751,21 @@

* Added new methods to `selenium-webdriver/firefox.Options`:
* addArguments()
* headless()
* windowSize()
* Deprecated `selenium-webdriver/firefox/binary.Binary`
* Removed `selenium-webdriver/firefox.Options#useGeckoDriver()`
* Removed the unused `selenium-webdriver/firefox/profile.decode()`
* Removed methods from `selenium-webdriver/firefox/profile.Profile` that had no effect since support
- Added new methods to `selenium-webdriver/firefox.Options`:
- addArguments()
- headless()
- windowSize()
- Deprecated `selenium-webdriver/firefox/binary.Binary`
- Removed `selenium-webdriver/firefox.Options#useGeckoDriver()`
- Removed the unused `selenium-webdriver/firefox/profile.decode()`
- Removed methods from `selenium-webdriver/firefox/profile.Profile` that had no
effect since support
for the legacy FirefoxDriver was dropped in 3.5.0:
* setNativeEventsEnabled
* nativeEventsEnabled
* getPort
* setPort
* Removed `selenium-webdriver/firefox.ServiceBuilder#setFirefoxBinary()`; custom binaries should be
- setNativeEventsEnabled
- nativeEventsEnabled
- getPort
- setPort
- Removed `selenium-webdriver/firefox.ServiceBuilder#setFirefoxBinary()`; custom
binaries should be
configured through the `firefox.Options` class.
* Removed `selenium-webdriver/firefox.Capability`. These hold overs from the legacy FirefoxDriver
- Removed `selenium-webdriver/firefox.Capability`. These hold overs from the
legacy FirefoxDriver
are no longer supported.

@@ -727,5 +775,5 @@

* Deprecated `error.ElementNotVisibleError` in favor of the more generic
- Deprecated `error.ElementNotVisibleError` in favor of the more generic
`error.ElementNotInteractableError`.
* Support the `httpOnly` option when adding a cookie.
- Support the `httpOnly` option when adding a cookie.

@@ -741,17 +789,24 @@ ## v3.5.0

* Removed native support for Firefox 46 and older.
* The `SELENIUM_MARIONETTE` enviornment variable no longer has an effect.
* `selenium-webdriver/firefox.Capability.MARIONETTE` is deprecated.
* `selenium-webdriver/firefox.Options#useGeckoDriver()` is deprecated and now a no-op.
* `firefox.Options` will no longer discard the `"moz:firefoxOptions"` set in user provided
capabilities (via `Builder.withCapabilities({})`). When both are used, the settings
- Removed native support for Firefox 46 and older.
- The `SELENIUM_MARIONETTE` enviornment variable no longer has an effect.
- `selenium-webdriver/firefox.Capability.MARIONETTE` is deprecated.
- `selenium-webdriver/firefox.Options#useGeckoDriver()` is deprecated and now
a no-op.
- `firefox.Options` will no longer discard the `"moz:firefoxOptions"` set in
user provided
capabilities (via `Builder.withCapabilities({})`). When both are used, the
settings
in `firefox.Options` will be applied _last_.
* Added `chrome.Options#headless()` and `chrome.Options#windowSize()`, which may be used to start
Chrome in headless mode (requires Chrome 59+) and to set the initial window size, respectively.
- Added `chrome.Options#headless()` and `chrome.Options#windowSize()`, which may
be used to start
Chrome in headless mode (requires Chrome 59+) and to set the initial window
size, respectively.
### Changes for W3C WebDriver Spec Compliance
* Added `error.WebDriverError#remoteStacktrace` to capture the stacktrace reported by a remote
- Added `error.WebDriverError#remoteStacktrace` to capture the stacktrace
reported by a remote
WebDriver endpoint (if any).
* Fixed `WebElement#sendKeys` to send text as a string instead of an array of strings.
- Fixed `WebElement#sendKeys` to send text as a string instead of an array of
strings.

@@ -763,54 +818,64 @@ ## v3.4.0

This release
requires [geckodriver 0.15.0](https://github.com/mozilla/geckodriver/releases/tag/v0.15.0) or newer.
requires [geckodriver 0.15.0](https://github.com/mozilla/geckodriver/releases/tag/v0.15.0)
or newer.
### API Changes
* Added `Options#getTimeouts()` for retrieving the currently configured session timeouts (i.e.
implicit wait). This method will only work with W3C compatible WebDriver implementations.
* Deprecated the `Timeouts` class in favor of `Options#setTimeouts()`, which supports setting
- Added `Options#getTimeouts()` for retrieving the currently configured session
timeouts (i.e.
implicit wait). This method will only work with W3C compatible WebDriver
implementations.
- Deprecated the `Timeouts` class in favor of `Options#setTimeouts()`, which
supports setting
multiple timeouts at once.
* Added support for emulating different network conditions (e.g., offline, 2G, WiFi) on Chrome.
- Added support for emulating different network conditions (e.g., offline, 2G,
WiFi) on Chrome.
### Changes for W3C WebDriver Spec Compliance
* Fixed W3C response parsing, which expects response data to always be a JSON object with a `value`
- Fixed W3C response parsing, which expects response data to always be a JSON
object with a `value`
key.
* Added W3C endpoints for interacting with various types of
- Added W3C endpoints for interacting with various types of
[user prompts](https://w3c.github.io/webdriver/webdriver-spec.html#user-prompts).
* Added W3C endpoints for remotely executing scripts.
* Added W3C endpoints to get current window handle and all windows handles.
- Added W3C endpoints for remotely executing scripts.
- Added W3C endpoints to get current window handle and all windows handles.
## v3.3.0
* Added warning log messages when the user creates new managed promises, or schedules unchained
- Added warning log messages when the user creates new managed promises, or
schedules unchained
tasks. Users may opt in to printing these log messages with
```js
const {logging} = require('selenium-webdriver');
logging.installConsoleHandler();
logging.getLogger('promise.ControlFlow').setLevel(logging.Level.WARNING);
const { logging } = require('selenium-webdriver')
logging.installConsoleHandler()
logging.getLogger('promise.ControlFlow').setLevel(logging.Level.WARNING)
```
* If the `JAVA_HOME` environment variable is set, use it to locate java.exe.
- If the `JAVA_HOME` environment variable is set, use it to locate java.exe.
## v3.2.0
* Release skipped to stay in sync with the main Selenium project.
- Release skipped to stay in sync with the main Selenium project.
## v3.1.0
* The `lib` package is once again platform agnostic (excluding `lib/devmode`).
* Deprecated `promise.when(value, callback, errback)`.
- The `lib` package is once again platform agnostic (excluding `lib/devmode`).
- Deprecated `promise.when(value, callback, errback)`.
Use `promise.fulfilled(value).then(callback, errback)`
* Changed `promise.fulfilled(value)`, `promise.rejected(reason)` and
`promise.defer()` to all use native promises when the promise manager is disabled.
* Properly handle W3C error responses to new session commands.
* Updated `selenium-webdriver/testing` to export `describe.only` along with
- Changed `promise.fulfilled(value)`, `promise.rejected(reason)` and
`promise.defer()` to all use native promises when the promise manager is
disabled.
- Properly handle W3C error responses to new session commands.
- Updated `selenium-webdriver/testing` to export `describe.only` along with
`describe.skip`.
* Fixed `selenium-webdriver/lib/until.ableToSwitchToFrame`. It was previously dropping arguments and
- Fixed `selenium-webdriver/lib/until.ableToSwitchToFrame`. It was previously
dropping arguments and
would never work.
* Added the ability to use Firefox Nightly
* If Firefox cannot be found in the default location, look for it on the PATH
* Allow SafariDriver to use Safari Technology Preview.
* Use the proper wire command for WebElement.getLocation() and WebElement.getSize() for W3C
- Added the ability to use Firefox Nightly
- If Firefox cannot be found in the default location, look for it on the PATH
- Allow SafariDriver to use Safari Technology Preview.
- Use the proper wire command for WebElement.getLocation() and
WebElement.getSize() for W3C
compliant drivers.

@@ -820,9 +885,12 @@

* More API adjustments to align with native Promises
* Deprecated `promise.fulfilled(value)`, use `promise.Promise#resolve(value)`
* Deprecated `promise.rejected(reason)`, use `promise.Promise#reject(reason)`
* When a `wait()` condition times out, the returned promise will now be rejected with
- More API adjustments to align with native Promises
- Deprecated `promise.fulfilled(value)`, use `promise.Promise#resolve(value)`
- Deprecated `promise.rejected(reason)`, use `promise.Promise#reject(reason)`
- When a `wait()` condition times out, the returned promise will now be rejected
with
an `error.TimeoutError` instead of a generic `Error` object.
* `WebDriver#wait()` will now throw a TypeError if an invalid wait condition is provided.
* Properly catch unhandled promise rejections with an action sequence (only impacts when the promise
- `WebDriver#wait()` will now throw a TypeError if an invalid wait condition is
provided.
- Properly catch unhandled promise rejections with an action sequence (only
impacts when the promise
manager is disabled).

@@ -832,4 +900,5 @@

* (__NOTICE__) The minimum supported version of Node is now 6.9.0 LTS
* Removed support for the SafariDriver browser extension. This has been replaced by Apple's
- (**NOTICE**) The minimum supported version of Node is now 6.9.0 LTS
- Removed support for the SafariDriver browser extension. This has been replaced
by Apple's
safaridriver, which is included wtih Safari 10

@@ -840,17 +909,22 @@ (available on OS X El Capitan and macOS Sierra).

* geckodriver v0.11.0 or newer is now required for Firefox.
* Fixed potential reference errors in `selenium-webdriver/testing` when users create a cycle with
- geckodriver v0.11.0 or newer is now required for Firefox.
- Fixed potential reference errors in `selenium-webdriver/testing` when users
create a cycle with
mocha by running with mocha's `--hook` flag.
* Fixed `WebDriver.switchTo().activeElement()` to use the correct HTTP method for compatibility with
- Fixed `WebDriver.switchTo().activeElement()` to use the correct HTTP method
for compatibility with
the W3C spec.
* Update the `selenium-webdriver/firefox` module to use geckodriver's
- Update the `selenium-webdriver/firefox` module to use geckodriver's
"moz:firefoxOptions" dictionary for Firefox-specific configuration values.
* Extending the `selenium-webdriver/testing` module to support tests defined using generator
- Extending the `selenium-webdriver/testing` module to support tests defined
using generator
functions.
* The promise manager can be disabled by setting an enviornment variable:
`SELENIUM_PROMISE_MANAGER=0`. This is part of a larger plan to remove the promise manager, as
- The promise manager can be disabled by setting an enviornment variable:
`SELENIUM_PROMISE_MANAGER=0`. This is part of a larger plan to remove the
promise manager, as
documented at
<https://github.com/SeleniumHQ/selenium/issues/2969>
* When communicating with a W3C-compliant remote end, use the atoms library for
the `WebElement.getAttribute()` and `WebElement.isDisplayed()` commands. This behavior is
- When communicating with a W3C-compliant remote end, use the atoms library for
the `WebElement.getAttribute()` and `WebElement.isDisplayed()` commands. This
behavior is
consistent with the java, .net, python, and ruby clients.

@@ -860,15 +934,19 @@

* Removed `safari.Options#useLegacyDriver()`
* Reduced the API on `promise.Thenable` for compatibility with native promises:
* Removed `#isPending()`
* Removed `#cancel()`
* Removed `#finally()`
* Changed all subclasses of `webdriver.WebDriver` to overload the static
function `WebDriver.createSession()` instead of doing work in the constructor. All constructors
now inherit the base class' function signature. Users are still encouraged to use the `Builder`
- Removed `safari.Options#useLegacyDriver()`
- Reduced the API on `promise.Thenable` for compatibility with native promises:
- Removed `#isPending()`
- Removed `#cancel()`
- Removed `#finally()`
- Changed all subclasses of `webdriver.WebDriver` to overload the static
function `WebDriver.createSession()` instead of doing work in the constructor.
All constructors
now inherit the base class' function signature. Users are still encouraged to
use the `Builder`
class instead of creating drivers directly.
* `Builder#build()` now returns a "thenable" WebDriver instance, allowing users to immediately
schedule commands (as before), or issue them through standard promise callbacks. This is the same
- `Builder#build()` now returns a "thenable" WebDriver instance, allowing users
to immediately
schedule commands (as before), or issue them through standard promise
callbacks. This is the same
pattern already employed for WebElements.
* Removed `Builder#buildAsync()` as it was redundant with the new semantics of
- Removed `Builder#buildAsync()` as it was redundant with the new semantics of
`build()`.

@@ -878,12 +956,17 @@

* Fixed a bug where the promise manager would silently drop callbacks after recovering from an
- Fixed a bug where the promise manager would silently drop callbacks after
recovering from an
unhandled promise rejection.
* Added the `firefox.ServiceBuilder` class, which may be used to customize the geckodriver used
- Added the `firefox.ServiceBuilder` class, which may be used to customize the
geckodriver used
for `firefox.Driver` instances.
* Added support for Safari 10 safaridriver. safaridriver may be disabled via tha
- Added support for Safari 10 safaridriver. safaridriver may be disabled via tha
API, `safari.Options#useLegacyDriver`, to use the safari extension driver.
* Updated the `lib/proxy` module to support configuring a SOCKS proxy.
* For the `promise.ControlFlow`, fire the "uncaughtException" event in a new turn of the JS event
loop. As a result of this change, any errors thrown by an event listener will propagate to the
global error handler. Previously, this event was fired with in the context of a (native) promise
- Updated the `lib/proxy` module to support configuring a SOCKS proxy.
- For the `promise.ControlFlow`, fire the "uncaughtException" event in a new
turn of the JS event
loop. As a result of this change, any errors thrown by an event listener will
propagate to the
global error handler. Previously, this event was fired with in the context of
a (native) promise
callback, causing errors to be silently suppressed in the promise chain.

@@ -893,12 +976,13 @@

* Added `remote.DriverService.Builder` as a base class for configuring DriverService instances that
- Added `remote.DriverService.Builder` as a base class for configuring
DriverService instances that
run in a child-process. The
`chrome.ServiceBuilder`, `edge.ServiceBuilder`, and `opera.ServiceBuilder`
classes now all extend this base class with browser-specific options.
* For each of the ServiceBuilder classes, renamed `usingPort` and
- For each of the ServiceBuilder classes, renamed `usingPort` and
`withEnvironment` to `setPort` and `setEnvironment`, respectively.
* Renamed `chrome.ServiceBuilder#setUrlBasePath` to `#setPath`
* Changed the signature of the `firefox.Driver` from `(config, flow, executor)`
- Renamed `chrome.ServiceBuilder#setUrlBasePath` to `#setPath`
- Changed the signature of the `firefox.Driver` from `(config, flow, executor)`
to `(config, executor, flow)`.
* Exposed the `Condition` and `WebElementCondition` classes from the top-level
- Exposed the `Condition` and `WebElementCondition` classes from the top-level
`selenium-webdriver` module (these were previously only available from

@@ -909,3 +993,3 @@ `lib/webdriver`).

* Updated command mappings
- Updated command mappings
for [getting](https://w3c.github.io/webdriver/webdriver-spec.html#get-window-position)

@@ -919,23 +1003,27 @@ and [setting](https://w3c.github.io/webdriver/webdriver-spec.html#set-window-position)

* Moved the `builder.Builder` class into the main module (`selenium-webdriver`).
* Removed the `builder` module.
* Fix `webdriver.WebDriver#setFileDetector` when driving Chrome or Firefox on a remote machine.
- Moved the `builder.Builder` class into the main module (`selenium-webdriver`).
- Removed the `builder` module.
- Fix `webdriver.WebDriver#setFileDetector` when driving Chrome or Firefox on a
remote machine.
## v3.0.0-beta-1
* Allow users to set the agent used for HTTP connections through
- Allow users to set the agent used for HTTP connections through
`builder.Builder#usingHttpAgent()`
* Added new wait conditions: `until.urlIs()`, `until.urlContains()`,
- Added new wait conditions: `until.urlIs()`, `until.urlContains()`,
`until.urlMatches()`
* Added work around for [GeckoDriver bug](https://bugzilla.mozilla.org/show_bug.cgi?id=1274924)
- Added work around
for [GeckoDriver bug](https://bugzilla.mozilla.org/show_bug.cgi?id=1274924)
raising a type conversion error
* Internal cleanup replacing uses of managed promises with native promises
* Removed the mandatory use of Firefox Dev Edition, when using Marionette driver
* Fixed timeouts' URL
* Properly send HTTP requests when using a WebDriver server proxy
* Properly configure proxies when using the geckodriver
* `http.Executor` now accepts a promised client. The `builder.Builder` class will now use this
- Internal cleanup replacing uses of managed promises with native promises
- Removed the mandatory use of Firefox Dev Edition, when using Marionette driver
- Fixed timeouts' URL
- Properly send HTTP requests when using a WebDriver server proxy
- Properly configure proxies when using the geckodriver
- `http.Executor` now accepts a promised client. The `builder.Builder` class
will now use this
instead of a `command.DeferredExecutor` when creating WebDriver instances.
* For Chrome and Firefox, the `builder.Builder` class will always return an
instanceof `chrome.Driver` and `firefox.Driver`, respectively, even when configured to use a
- For Chrome and Firefox, the `builder.Builder` class will always return an
instanceof `chrome.Driver` and `firefox.Driver`, respectively, even when
configured to use a
remote server (from `builder.Builder#usingServer(url)`,

@@ -946,43 +1034,50 @@ `SELENIUM_REMOTE_URL`, etc).

* `promise.Deferred` is no longer a thenable object.
* `Options#addCookie()` now takes a record object instead of 7 individual parameters. A TypeError
- `promise.Deferred` is no longer a thenable object.
- `Options#addCookie()` now takes a record object instead of 7 individual
parameters. A TypeError
will be thrown if addCookie() is called with invalid arguments.
* When adding cookies, the desired expiry must be provided as a Date or in
_seconds_ since epoch. When retrieving cookies, the expiration is always returned in seconds.
* Renamed `firefox.Options#useMarionette` to `firefox.Options#useGeckoDriver`
* Removed deprecated modules:
* `selenium-webdriver/error` (use `selenium-webdriver/lib/error`,\
or the `error` property exported by `selenium-webdriver`)
* `selenium-webdriver/executors` — this was not previously deprecated, but is no longer used.
* Removed deprecated types:
* `command.DeferredExecutor` — this was not previously deprecated, but is no longer used. It can
be trivially implemented by clients should it be needed.
* `error.InvalidSessionIdError` (use `error.NoSuchSessionError`)
* `executors.DeferredExecutor`
* `until.Condition` (use `webdriver.Condition`)
* `until.WebElementCondition` (use `webdriver.WebElementCondition`)
* `webdriver.UnhandledAlertError` (use `error.UnexpectedAlertOpenError`)
* Removed deprecated functions:
* `Deferred#cancel()`
* `Deferred#catch()`
* `Deferred#finally()`
* `Deferred#isPending()`
* `Deferred#then()`
* `Promise#thenCatch()`
* `Promise#thenFinally()`
* `WebDriver#isElementPresent()`
* `WebElement#getInnerHtml()`
* `WebElement#getOuterHtml()`
* `WebElement#getRawId()`
* `WebElement#isElementPresent()`
* Removed deprecated properties:
* `WebDriverError#code`
- When adding cookies, the desired expiry must be provided as a Date or in
_seconds_ since epoch. When retrieving cookies, the expiration is always
returned in seconds.
- Renamed `firefox.Options#useMarionette` to `firefox.Options#useGeckoDriver`
- Removed deprecated modules:
- `selenium-webdriver/error` (use `selenium-webdriver/lib/error`,\
or the `error` property exported by `selenium-webdriver`)
- `selenium-webdriver/executors` — this was not previously deprecated, but is
no longer used.
- Removed deprecated types:
- `command.DeferredExecutor` — this was not previously deprecated, but is no
longer used. It can
be trivially implemented by clients should it be needed.
- `error.InvalidSessionIdError` (use `error.NoSuchSessionError`)
- `executors.DeferredExecutor`
- `until.Condition` (use `webdriver.Condition`)
- `until.WebElementCondition` (use `webdriver.WebElementCondition`)
- `webdriver.UnhandledAlertError` (use `error.UnexpectedAlertOpenError`)
- Removed deprecated functions:
- `Deferred#cancel()`
- `Deferred#catch()`
- `Deferred#finally()`
- `Deferred#isPending()`
- `Deferred#then()`
- `Promise#thenCatch()`
- `Promise#thenFinally()`
- `WebDriver#isElementPresent()`
- `WebElement#getInnerHtml()`
- `WebElement#getOuterHtml()`
- `WebElement#getRawId()`
- `WebElement#isElementPresent()`
- Removed deprecated properties:
- `WebDriverError#code`
## v2.53.2
* Changed `io.exists()` to return a rejected promise if the input path is not a string
* Deprecated `Promise#thenFinally()` - use `Promise#finally()`. The thenFinally shim added to the
- Changed `io.exists()` to return a rejected promise if the input path is not a
string
- Deprecated `Promise#thenFinally()` - use `Promise#finally()`. The thenFinally
shim added to the
promise module in v2.53.0 will be removed in v3.0 Sorry for the churn!
* FIXED: capabilities serialization now properly handles undefined vs. false-like values.
* FIXED: properly handle responses from the remote end in
- FIXED: capabilities serialization now properly handles undefined vs.
false-like values.
- FIXED: properly handle responses from the remote end in
`WebDriver.attachToSession`

@@ -992,3 +1087,3 @@

* FIXED: for consistency with the other language bindings, `remote.FileDetector`
- FIXED: for consistency with the other language bindings, `remote.FileDetector`
will ignore paths that refer to a directory.

@@ -1000,29 +1095,39 @@

* Added preliminary support for Marionette, Mozilla's WebDriver implementation for Firefox.
- Added preliminary support for Marionette, Mozilla's WebDriver implementation
for Firefox.
Marionette may be enabled via the API,
`firefox.Options#useMarionette`, or by setting the `SELENIUM_MARIONETTE`
environment variable.
* Moved all logic for parsing and interpreting responses from the remote end into the
- Moved all logic for parsing and interpreting responses from the remote end
into the
individual `command.Executor` implementations.
* For consistency with the other Selenium language bindings,
`WebDriver#isElementPresent()` and `WebElement#isElementPresent()` have been deprecated. These
methods will be removed in v3.0. Use the findElements command to test for the presence of an
- For consistency with the other Selenium language bindings,
`WebDriver#isElementPresent()` and `WebElement#isElementPresent()` have been
deprecated. These
methods will be removed in v3.0. Use the findElements command to test for the
presence of an
element:
driver.findElements(By.css('.foo')).then(found => !!found.length);
* Added support for W3C-spec compliant servers.
* For consistent naming, deprecating `error.InvalidSessionIdError` in favor of
- Added support for W3C-spec compliant servers.
- For consistent naming, deprecating `error.InvalidSessionIdError` in favor of
`error.NoSuchSessionError`.
* Moved the `error` module to `lib/error` so all core modules are co-located. The top-level `error`
- Moved the `error` module to `lib/error` so all core modules are co-located.
The top-level `error`
module will be removed in v3.0.
* Moved `until.Condition` and `until.WebElementCondition` to the webdriver module to break a
- Moved `until.Condition` and `until.WebElementCondition` to the webdriver
module to break a
circular dependency.
* Added support for setting the username and password in basic auth pop-up dialogs (currently IE
- Added support for setting the username and password in basic auth pop-up
dialogs (currently IE
only).
* Deprecated `WebElement#getInnerHtml()` and `WebEleemnt#getOuterHtml()`
* Deprecated `Promise#thenCatch()` - use `Promise#catch()` instead
* Deprecated `Promise#thenFinally()` - use `promise.thenFinally()` instead
* FIXED: `io.findInPath()` will no longer match against directories that have the same basename as
- Deprecated `WebElement#getInnerHtml()` and `WebEleemnt#getOuterHtml()`
- Deprecated `Promise#thenCatch()` - use `Promise#catch()` instead
- Deprecated `Promise#thenFinally()` - use `promise.thenFinally()` instead
- FIXED: `io.findInPath()` will no longer match against directories that have
the same basename as
the target file.
* FIXED: `phantomjs.Driver` now takes a third argument that defines the path to a log file to use
- FIXED: `phantomjs.Driver` now takes a third argument that defines the path to
a log file to use
for the phantomjs executable's output. This may be quickly set at runtime with

@@ -1033,5 +1138,8 @@ the `SELENIUM_PHANTOMJS_LOG` environment variable.

* Changed `element.sendKeys(...)` to send the key sequence as an array where each element defines a
single key. The legacy wire protocol permits arrays where each element is a string of arbitrary
length. This change is solely at the protocol level and should have no user-visible effect.
- Changed `element.sendKeys(...)` to send the key sequence as an array where
each element defines a
single key. The legacy wire protocol permits arrays where each element is a
string of arbitrary
length. This change is solely at the protocol level and should have no
user-visible effect.

@@ -1049,33 +1157,44 @@ ## v2.52.0

* Add support for Microsoft's Edge web browser
* Added `webdriver.Builder#buildAsync()`, which returns a promise that will be fulfilled with the
newly created WebDriver instance once the associated browser has been full initialized. This is
purely a convenient alternative to the existing build() method as the WebDriver class will always
- Add support for Microsoft's Edge web browser
- Added `webdriver.Builder#buildAsync()`, which returns a promise that will be
fulfilled with the
newly created WebDriver instance once the associated browser has been full
initialized. This is
purely a convenient alternative to the existing build() method as the
WebDriver class will always
defer commands until it has a fully created browser.
* Added `firefox.Profile#setHost()` which may be used to set the host that the FirefoxDriver's
- Added `firefox.Profile#setHost()` which may be used to set the host that the
FirefoxDriver's
server listens for commands on. The server uses
"localhost" by default.
* Added `promise.Promise#catch()` for API compatibility with native Promises.
`promise.Promise#thenCatch()` is not yet deprecated, but it simply delegates to `catch`.
* Changed some `io` operations to use native promises.
* Changed `command.Executor#execute()` and `HttpClient#send()` to return promises instead of using
- Added `promise.Promise#catch()` for API compatibility with native Promises.
`promise.Promise#thenCatch()` is not yet deprecated, but it simply delegates
to `catch`.
- Changed some `io` operations to use native promises.
- Changed `command.Executor#execute()` and `HttpClient#send()` to return
promises instead of using
callback passing.
* Replaced the `Serializable` class with an internal, Symbol-defined method.
* Changed the `Capabilities` class to extend the native `Map` type.
* Changed the `Capabilities.has(key)` to only test if a capability has been set
- Replaced the `Serializable` class with an internal, Symbol-defined method.
- Changed the `Capabilities` class to extend the native `Map` type.
- Changed the `Capabilities.has(key)` to only test if a capability has been set
(Map semantics). To check whether the value is true, use `get(key)`.
* Deprecated `executors.DeferredExecutor` in favor of
- Deprecated `executors.DeferredExecutor` in favor of
`lib/command.DeferredExecutor`.
* API documentation is no longer distributed with the npm package, but remains available
- API documentation is no longer distributed with the npm package, but remains
available
at <http://seleniumhq.github.io/selenium/docs/api/javascript/>
* Rewrote the `error` module to export an Error subtype for each type of error defined in
- Rewrote the `error` module to export an Error subtype for each type of error
defined in
the [W3C WebDriver spec](https://w3c.github.io/webdriver/webdriver-spec.html#handling-errors).
* Changed the `http.Request` and `http.Response` classes to store headers in maps instead of object
- Changed the `http.Request` and `http.Response` classes to store headers in
maps instead of object
literals.
* Updated `ws` dependency to version `1.0.1`.
* Removed fluent predicates "is" and "not" from the experimental
- Updated `ws` dependency to version `1.0.1`.
- Removed fluent predicates "is" and "not" from the experimental
`testing/assert` module.
* Wait conditions that locate an element, or that wait on an element's state, will return a
- Wait conditions that locate an element, or that wait on an element's state,
will return a
WebElementPromise.
* Lots of internal clean-up to break selenium-webdriver's long standing dependency on Google's
- Lots of internal clean-up to break selenium-webdriver's long standing
dependency on Google's
Closure library.

@@ -1085,3 +1204,4 @@

* Updated the `By` locators that are not in the W3C spec to delegated to using CSS
- Updated the `By` locators that are not in the W3C spec to delegated to using
CSS
selectors: `By.className`, `By.id`, `By.name`, and `By.tagName`.

@@ -1091,26 +1211,33 @@

* _Releases skipped to stay in sync with the rest of the Selenium project_
- _Releases skipped to stay in sync with the rest of the Selenium project_
## v2.48.2
* Added `WebElement#takeScreenshot()`.
* More adjustments to promise callback tracking.
- Added `WebElement#takeScreenshot()`.
- More adjustments to promise callback tracking.
## v2.48.1
* FIXED: Adjusted how the control flow tracks promise callbacks to avoid a potential deadlock.
- FIXED: Adjusted how the control flow tracks promise callbacks to avoid a
potential deadlock.
## v2.48.0
* Node v0.12.x users must run with --harmony. _This is the last release that will support v0.12.x_
* FIXED: (Promise/A+ compliance) When a promise is rejected with a thenable, the promise adopts the
thenable as its rejection reason instead of waiting for it to settle. The previous (incorrect)
behavior was hidden by bugs in the `promises-aplus-tests` compliance test suite that were fixed in
- Node v0.12.x users must run with --harmony. _This is the last release that
will support v0.12.x_
- FIXED: (Promise/A+ compliance) When a promise is rejected with a thenable, the
promise adopts the
thenable as its rejection reason instead of waiting for it to settle. The
previous (incorrect)
behavior was hidden by bugs in the `promises-aplus-tests` compliance test
suite that were fixed in
version
`2.1.1`.
* FIXED: the `webdriver.promise.ControlFlow` now has a consistent execution order for
- FIXED: the `webdriver.promise.ControlFlow` now has a consistent execution
order for
tasks/callbacks scheduled in different turns of the JS event loop. Refer to
the `webdriver.promise` documentation for more details.
* FIXED: do not drop user auth from the WebDriver server URL.
* FIXED: a single `firefox.Binary` instance may be used to configure and launch multiple
- FIXED: do not drop user auth from the WebDriver server URL.
- FIXED: a single `firefox.Binary` instance may be used to configure and launch
multiple
FirefoxDriver sessions.

@@ -1125,6 +1252,9 @@

* FIXED: zip files created for transfer to a remote WebDriver server are no longer compressed. If
the zip contained a file that was already compressed, the server would return an "invalid code
- FIXED: zip files created for transfer to a remote WebDriver server are no
longer compressed. If
the zip contained a file that was already compressed, the server would return
an "invalid code
lengths set" error.
* FIXED: Surfaced the `loopback` option to `remote/SeleniumServer`. When set, the server will be
- FIXED: Surfaced the `loopback` option to `remote/SeleniumServer`. When set,
the server will be
accessed using the current host's loopback address.

@@ -1143,5 +1273,6 @@

* Add support for [Node v4.0.0](https://nodejs.org/en/blog/release/v4.0.0/)
* Updated `ws` dependency from `0.7.1` to `0.8.0`
* Bumped the minimum supported version of Node from `0.10.x` to `0.12.x`. This is in accordance with
- Add support for [Node v4.0.0](https://nodejs.org/en/blog/release/v4.0.0/)
- Updated `ws` dependency from `0.7.1` to `0.8.0`
- Bumped the minimum supported version of Node from `0.10.x` to `0.12.x`. This
is in accordance with
the Node support policy established in `v2.45.0`.

@@ -1151,4 +1282,4 @@

* Fixed internal module loading on Windows.
* Fixed error message format on timeouts for `until.elementLocated()`
- Fixed internal module loading on Windows.
- Fixed error message format on timeouts for `until.elementLocated()`
and `until.elementsLocated()`.

@@ -1158,31 +1289,41 @@

* Exposed a new logging API via the `webdriver.logging` module. For usage, see
- Exposed a new logging API via the `webdriver.logging` module. For usage, see
`example/logging.js`.
* Added support for using a proxy server for WebDriver commands. See `Builder#usingWebDriverProxy()`
- Added support for using a proxy server for WebDriver commands.
See `Builder#usingWebDriverProxy()`
for more info.
* Removed deprecated functions:
* Capabilities#toJSON()
* UnhandledAlertError#getAlert()
* chrome.createDriver()
* phantomjs.createDriver()
* promise.ControlFlow#annotateError()
* promise.ControlFlow#await()
* promise.ControlFlow#clearHistory()
* promise.ControlFlow#getHistory()
* Removed deprecated enum values: `ErrorCode.NO_MODAL_DIALOG_OPEN` and
- Removed deprecated functions:
- Capabilities#toJSON()
- UnhandledAlertError#getAlert()
- chrome.createDriver()
- phantomjs.createDriver()
- promise.ControlFlow#annotateError()
- promise.ControlFlow#await()
- promise.ControlFlow#clearHistory()
- promise.ControlFlow#getHistory()
- Removed deprecated enum values: `ErrorCode.NO_MODAL_DIALOG_OPEN` and
`ErrorCode.MODAL_DIALOG_OPENED`. Use `ErrorCode.NO_SUCH_ALERT` and
`ErrorCode.UNEXPECTED_ALERT_OPEN`, respectively.
* FIXED: The `promise.ControlFlow` will maintain state for promise chains generated in a loop.
* FIXED: Correct serialize target elements used in an action sequence.
* FIXED: `promise.ControlFlow#wait()` now has consistent semantics for an omitted or 0-timeout: it
- FIXED: The `promise.ControlFlow` will maintain state for promise chains
generated in a loop.
- FIXED: Correct serialize target elements used in an action sequence.
- FIXED: `promise.ControlFlow#wait()` now has consistent semantics for an
omitted or 0-timeout: it
will wait indefinitely.
* FIXED: `remote.DriverService#start()` will now fail if the child process dies while waiting for
the server to start accepting requests. Previously, start would continue to poll the server
- FIXED: `remote.DriverService#start()` will now fail if the child process dies
while waiting for
the server to start accepting requests. Previously, start would continue to
poll the server
address until the timeout expired.
* FIXED: Skip launching Firefox with the `-silent` flag to preheat the profile. Starting with
Firefox 38, this would cause the browser to crash. This step, which was first introduced for
- FIXED: Skip launching Firefox with the `-silent` flag to preheat the profile.
Starting with
Firefox 38, this would cause the browser to crash. This step, which was first
introduced for
Selenium's java client back with Firefox 2, no longer appears to be required.
* FIXED: 8564: `firefox.Driver#quit()` will wait for the Firefox process to terminate before
deleting the temporary webdriver profile. This eliminates a race condition where Firefox would
write profile data during shutdown, causing the `rm -rf` operation on the profile directory to
- FIXED: 8564: `firefox.Driver#quit()` will wait for the Firefox process to
terminate before
deleting the temporary webdriver profile. This eliminates a race condition
where Firefox would
write profile data during shutdown, causing the `rm -rf` operation on the
profile directory to
fail.

@@ -1192,5 +1333,7 @@

* FIXED: 8548: Task callbacks are once again dropped if the task was cancelled due to a previously
- FIXED: 8548: Task callbacks are once again dropped if the task was cancelled
due to a previously
uncaught error within the frame.
* FIXED: 8496: Extended the `chrome.Options` API to cover all configuration options (e.g. mobile
- FIXED: 8496: Extended the `chrome.Options` API to cover all configuration
options (e.g. mobile
emulation and performance logging) documented on the

@@ -1211,7 +1354,9 @@ ChromeDriver [project site](https://chromedriver.chromium.org/capabilities).

* Added native browser support for Internet Explorer, Opera 26+, and Safari
* With the release of [Node 0.12.0](http://blog.nodejs.org/2015/02/06/node-v0-12-0-stable/)
- Added native browser support for Internet Explorer, Opera 26+, and Safari
- With the release
of [Node 0.12.0](http://blog.nodejs.org/2015/02/06/node-v0-12-0-stable/)
(finally!), the minimum supported version of Node is now `0.10.x`.
* The `promise` module is now [Promises/A+](https://promisesaplus.com/)
compliant. The biggest compliance change is that promise callbacks are now invoked in a future
- The `promise` module is now [Promises/A+](https://promisesaplus.com/)
compliant. The biggest compliance change is that promise callbacks are now
invoked in a future
turn of the JS event loop. For example:

@@ -1236,6 +1381,10 @@

The `promise.ControlFlow` class has been updated to track the asynchronous breaks required by
The `promise.ControlFlow` class has been updated to track the asynchronous
breaks required by
Promises/A+, so there are no changes to task execution order.
* Updated how errors are annotated on failures. When a task fails, the stacktrace from when that
task was scheduled is appended to the rejection reason with a `From:` prefix (if it is an Error
- Updated how errors are annotated on failures. When a task fails, the
stacktrace from when that
task was scheduled is appended to the rejection reason with a `From:` prefix (
if it is an Error
object). For example:

@@ -1261,22 +1410,35 @@

* Changed the format of strings returned by `promise.ControlFlow#getSchedule`. This function now
accepts a boolean to control whether the returned string should include the stacktraces for when
- Changed the format of strings returned by `promise.ControlFlow#getSchedule`.
This function now
accepts a boolean to control whether the returned string should include the
stacktraces for when
each task was scheduled.
* Deprecating `promise.ControlFlow#getHistory`,
`promise.ControlFlow#clearHistory`, and `promise.ControlFlow#annotateError`. These functions were
all intended for internal use and are no longer necessary, so they have been made no-ops.
* `WebDriver.wait()` may now be used to wait for a promise to resolve, with an optional timeout.
- Deprecating `promise.ControlFlow#getHistory`,
`promise.ControlFlow#clearHistory`, and `promise.ControlFlow#annotateError`.
These functions were
all intended for internal use and are no longer necessary, so they have been
made no-ops.
- `WebDriver.wait()` may now be used to wait for a promise to resolve, with an
optional timeout.
Refer to the API documentation for more information.
* Added support for copying files to a remote Selenium via `sendKeys` to test file uploads. Refer to
the API documentation for more information. Sample usage included in `test/upload_test.js`
* Expanded the interactions API to include touch actions. See `WebDriver.touchActions()`.
* FIXED: 8380: `firefox.Driver` will delete its temporary profile on `quit`.
* FIXED: 8306: Stack overflow in promise callbacks eliminated.
* FIXED: 8221: Added support for defining custom command mappings. Includes support for
PhantomJS's `executePhantomJS` (requires PhantomJS 1.9.7 or GhostDriver 1.1.0).
* FIXED: 8128: When the FirefoxDriver marshals an object to the page for
`executeScript`, it defines additional properties (required by the driver's implementation). These
properties will no longer be enumerable and should be omitted (i.e. they won't show up in
- Added support for copying files to a remote Selenium via `sendKeys` to test
file uploads. Refer to
the API documentation for more information. Sample usage included
in `test/upload_test.js`
- Expanded the interactions API to include touch actions.
See `WebDriver.touchActions()`.
- FIXED: 8380: `firefox.Driver` will delete its temporary profile on `quit`.
- FIXED: 8306: Stack overflow in promise callbacks eliminated.
- FIXED: 8221: Added support for defining custom command mappings. Includes
support for
PhantomJS's `executePhantomJS` (requires PhantomJS 1.9.7 or GhostDriver
1.1.0).
- FIXED: 8128: When the FirefoxDriver marshals an object to the page for
`executeScript`, it defines additional properties (required by the driver's
implementation). These
properties will no longer be enumerable and should be omitted (i.e. they won't
show up in
JSON.stringify output).
* FIXED: 8094: The control flow will no longer deadlock when a task returns a promise that depends
- FIXED: 8094: The control flow will no longer deadlock when a task returns a
promise that depends
on the completion of sub-tasks.

@@ -1286,3 +1448,4 @@

* Added the `until` module, which defines common explicit wait conditions. Sample usage:
- Added the `until` module, which defines common explicit wait conditions.
Sample usage:

@@ -1296,8 +1459,12 @@ var firefox = require('selenium-webdriver/firefox'),

* FIXED: 8000: `Builder.forBrowser()` now accepts an empty string since some WebDriver
implementations ignore the value. A value must still be specified, however, since it is a required
- FIXED: 8000: `Builder.forBrowser()` now accepts an empty string since some
WebDriver
implementations ignore the value. A value must still be specified, however,
since it is a required
field in WebDriver's wire protocol.
* FIXED: 7994: The `stacktrace` module will not modify stack traces if the initial parse fails (e.g.
- FIXED: 7994: The `stacktrace` module will not modify stack traces if the
initial parse fails (e.g.
the user defined `Error.prepareStackTrace`)
* FIXED: 5855: Added a module (`until`) that defines several common conditions for use with explicit
- FIXED: 5855: Added a module (`until`) that defines several common conditions
for use with explicit
waits. See updated examples for usage.

@@ -1307,7 +1474,9 @@

* FIXED: 7905: `Builder.usingServer(url)` once again returns `this` for chaining.
- FIXED: 7905: `Builder.usingServer(url)` once again returns `this` for
chaining.
## v2.43.2-4
* No changes; version bumps while attempting to work around an issue with publishing to npm (a
- No changes; version bumps while attempting to work around an issue with
publishing to npm (a
version string may only be used once).

@@ -1317,3 +1486,4 @@

* Fixed an issue with flakiness when setting up the Firefox profile that could prevent the driver
- Fixed an issue with flakiness when setting up the Firefox profile that could
prevent the driver
from initializing properly.

@@ -1323,14 +1493,20 @@

* Added native support for Firefox - the Java Selenium server is no longer required.
* Added support for generator functions to `ControlFlow#execute` and
- Added native support for Firefox - the Java Selenium server is no longer
required.
- Added support for generator functions to `ControlFlow#execute` and
`ControlFlow#wait`. For more information, see documentation on
`webdriver.promise.consume`. Requires harmony support (run with
`node --harmony-generators` in `v0.11.x`).
* Various improvements to the `Builder` API. Notably, the `build()` function will no longer default
- Various improvements to the `Builder` API. Notably, the `build()` function
will no longer default
to attempting to use a server at
`http://localhost:4444/wd/hub` if it cannot start a browser directly - you must specify the
WebDriver server with `usingServer(url)`. You can also set the target browser and WebDriver server
through a pair of environment variables. See the documentation on the `Builder` constructor for
`http://localhost:4444/wd/hub` if it cannot start a browser directly - you
must specify the
WebDriver server with `usingServer(url)`. You can also set the target browser
and WebDriver server
through a pair of environment variables. See the documentation on
the `Builder` constructor for
more information.
* For consistency with the other language bindings, added browser specific classes that can be used
- For consistency with the other language bindings, added browser specific
classes that can be used
to start a browser without the builder.

@@ -1345,51 +1521,56 @@

* Promise A+ compliance: a promise may no longer resolve to itself.
* For consistency with other language bindings, deprecated
- Promise A+ compliance: a promise may no longer resolve to itself.
- For consistency with other language bindings, deprecated
`UnhandledAlertError#getAlert` and added `#getAlertText`.
`getAlert` will be removed in `2.45.0`.
* FIXED: 7641: Deprecated `ErrorCode.NO_MODAL_DIALOG_OPEN` and
- FIXED: 7641: Deprecated `ErrorCode.NO_MODAL_DIALOG_OPEN` and
`ErrorCode.MODAL_DIALOG_OPENED` in favor of the new
`ErrorCode.NO_SUCH_ALERT` and `ErrorCode.UNEXPECTED_ALERT_OPEN`, respectively.
* FIXED: 7563: Mocha integration no longer disables timeouts. Default Mocha timeouts apply (2000 ms)
- FIXED: 7563: Mocha integration no longer disables timeouts. Default Mocha
timeouts apply (2000 ms)
and may be changed using `this.timeout(ms)`.
* FIXED: 7470: Make it easier to create WebDriver instances in custom flows for parallel execution.
- FIXED: 7470: Make it easier to create WebDriver instances in custom flows for
parallel execution.
## v2.42.1
* FIXED: 7465: Fixed `net.getLoopbackAddress` on Windows
* FIXED: 7277: Support `done` callback in Mocha's BDD interface
* FIXED: 7156: `Promise#thenFinally` should not suppress original error
- FIXED: 7465: Fixed `net.getLoopbackAddress` on Windows
- FIXED: 7277: Support `done` callback in Mocha's BDD interface
- FIXED: 7156: `Promise#thenFinally` should not suppress original error
## v2.42.0
* Removed deprecated functions `Promise#addCallback()`,
- Removed deprecated functions `Promise#addCallback()`,
`Promise#addCallbacks()`, `Promise#addErrback()`, and `Promise#addBoth()`.
* Fail with a more descriptive error if the server returns a malformed redirect
* FIXED: 7300: Connect to ChromeDriver using the loopback address since ChromeDriver 2.10.267517
- Fail with a more descriptive error if the server returns a malformed redirect
- FIXED: 7300: Connect to ChromeDriver using the loopback address since
ChromeDriver 2.10.267517
binds to localhost by default.
* FIXED: 7339: Preserve wrapped test function's string representation for Mocha's BDD interface.
- FIXED: 7339: Preserve wrapped test function's string representation for Mocha'
s BDD interface.
## v2.41.0
* FIXED: 7138: export logging API from webdriver module.
* FIXED: 7105: beforeEach/it/afterEach properly bind `this` for Mocha tests.
- FIXED: 7138: export logging API from webdriver module.
- FIXED: 7105: beforeEach/it/afterEach properly bind `this` for Mocha tests.
## v2.40.0
* API documentation is now included in the docs directory.
* Added utility functions for working with an array of promises:
- API documentation is now included in the docs directory.
- Added utility functions for working with an array of promises:
`promise.all`, `promise.map`, and `promise.filter`
* Introduced `Promise#thenCatch()` and `Promise#thenFinally()`.
* Deprecated `Promise#addCallback()`, `Promise#addCallbacks()`,
- Introduced `Promise#thenCatch()` and `Promise#thenFinally()`.
- Deprecated `Promise#addCallback()`, `Promise#addCallbacks()`,
`Promise#addErrback()`, and `Promise#addBoth()`.
* Removed deprecated function `webdriver.WebDriver#getCapability`.
* FIXED: 6826: Added support for custom locators.
- Removed deprecated function `webdriver.WebDriver#getCapability`.
- FIXED: 6826: Added support for custom locators.
## v2.39.0
* Version bump to stay in sync with the Selenium project.
- Version bump to stay in sync with the Selenium project.
## v2.38.1
* FIXED: 6686: Changed `webdriver.promise.Deferred#cancel()` to silently no-op if the deferred has
- FIXED: 6686: Changed `webdriver.promise.Deferred#cancel()` to silently no-op
if the deferred has
already been resolved.

@@ -1399,37 +1580,43 @@

* When a promise is rejected, always annotate the stacktrace with the parent flow state so users can
- When a promise is rejected, always annotate the stacktrace with the parent
flow state so users can
identify the source of an error.
* Updated tests to reflect features not working correctly in the SafariDriver
- Updated tests to reflect features not working correctly in the SafariDriver
(cookie management and proxy support; see issues 5051, 5212, and 5503)
* FIXED: 6284: For mouse moves, correctly omit the x/y offsets if not specified as a function
- FIXED: 6284: For mouse moves, correctly omit the x/y offsets if not specified
as a function
argument (instead of passing (0,0)).
* FIXED: 6471: Updated documentation on `webdriver.WebElement#getAttribute`
* FIXED: 6612: On Unix, use the default IANA ephemeral port range if unable to retrieve the current
- FIXED: 6471: Updated documentation on `webdriver.WebElement#getAttribute`
- FIXED: 6612: On Unix, use the default IANA ephemeral port range if unable to
retrieve the current
system's port range.
* FIXED: 6617: Avoid triggering the node debugger when initializing the stacktrace module.
* FIXED: 6627: Safely rebuild chrome.Options from a partial JSON spec.
- FIXED: 6617: Avoid triggering the node debugger when initializing the
stacktrace module.
- FIXED: 6627: Safely rebuild chrome.Options from a partial JSON spec.
## v2.37.0
* FIXED: 6346: The remote.SeleniumServer class now accepts JVM arguments using the `jvmArgs` option.
- FIXED: 6346: The remote.SeleniumServer class now accepts JVM arguments using
the `jvmArgs` option.
## v2.36.0
* _Release skipped to stay in sync with main Selenium project._
- _Release skipped to stay in sync with main Selenium project._
## v2.35.2
* FIXED: 6200: Pass arguments to the Selenium server instead of to the JVM.
- FIXED: 6200: Pass arguments to the Selenium server instead of to the JVM.
## v2.35.1
* FIXED: 6090: Changed example scripts to use chromedriver.
- FIXED: 6090: Changed example scripts to use chromedriver.
## v2.35.0
* Version bump to stay in sync with the Selenium project.
- Version bump to stay in sync with the Selenium project.
## v2.34.1
* FIXED: 6079: The parent process should not wait for spawn driver service processes (chromedriver,
- FIXED: 6079: The parent process should not wait for spawn driver service
processes (chromedriver,
phantomjs, etc.)

@@ -1439,7 +1626,10 @@

* Added the `selenium-webdriver/testing/assert` module. This module simplifies writing assertions
- Added the `selenium-webdriver/testing/assert` module. This module simplifies
writing assertions
against promised values (see example in module documentation).
* Added the `webdriver.Capabilities` class.
* Added native support for the ChromeDriver. When using the `Builder`, requesting chrome without
specifying a remote server URL will default to the native ChromeDriver implementation. The
- Added the `webdriver.Capabilities` class.
- Added native support for the ChromeDriver. When using the `Builder`,
requesting chrome without
specifying a remote server URL will default to the native ChromeDriver
implementation. The
[ChromeDriver server](https://code.google.com/p/chromedriver/downloads/list)

@@ -1459,10 +1649,12 @@ must be downloaded separately.

* Added support for configuring proxies through the builder. For examples, see
- Added support for configuring proxies through the builder. For examples, see
`selenium-webdriver/test/proxy_test`.
* Added native support for PhantomJS.
* Changed signature of `SeleniumServer` to `SeleniumServer(jar, options)`.
* Tests are now included in the npm published package. See `README.md` for execution instructions
* Removed the deprecated `webdriver.Deferred#resolve` and
- Added native support for PhantomJS.
- Changed signature of `SeleniumServer` to `SeleniumServer(jar, options)`.
- Tests are now included in the npm published package. See `README.md` for
execution instructions
- Removed the deprecated `webdriver.Deferred#resolve` and
`webdriver.promise.resolved` functions.
* Removed the ability to connect to an existing session from the Builder. This feature is intended
- Removed the ability to connect to an existing session from the Builder. This
feature is intended
for use with the browser-based client.

@@ -1472,8 +1664,8 @@

* Added support for WebDriver's logging API
* FIXED: 5511: Added webdriver.manage().timeouts().pageLoadTimeout(ms)
- Added support for WebDriver's logging API
- FIXED: 5511: Added webdriver.manage().timeouts().pageLoadTimeout(ms)
## v2.32.1
* FIXED: 5541: Added missing return statement for windows in
- FIXED: 5541: Added missing return statement for windows in
`portprober.findFreePort()`

@@ -1483,50 +1675,46 @@

* Added the `selenium-webdriver/testing` package, which provides a basic framework for writing tests
- Added the `selenium-webdriver/testing` package, which provides a basic
framework for writing tests
using Mocha. See
`selenium-webdriver/example/google_search_test.js` for usage.
* For Promises/A+ compatibility, backing out the change in 2.30.0 that ensured rejections were
- For Promises/A+ compatibility, backing out the change in 2.30.0 that ensured
rejections were
always Error objects. Rejection reasons are now left as is.
* Removed deprecated functions originally scheduled for removal in 2.31.0
* promise.Application.getInstance()
* promise.ControlFlow#schedule()
* promise.ControlFlow#scheduleTimeout()
* promise.ControlFlow#scheduleWait()
* Renamed some functions for consistency with Promises/A+ terminology. The original functions have
- Removed deprecated functions originally scheduled for removal in 2.31.0
- promise.Application.getInstance()
- promise.ControlFlow#schedule()
- promise.ControlFlow#scheduleTimeout()
- promise.ControlFlow#scheduleWait()
- Renamed some functions for consistency with Promises/A+ terminology. The
original functions have
been deprecated and will be removed in 2.34.0:
* promise.resolved() -> promise.fulfilled()
* promise.Deferred#resolve() -> promise.Deferred#fulfill()
* FIXED: remote.SeleniumServer#stop now shuts down within the active control flow, allowing scripts
- promise.resolved() -> promise.fulfilled()
- promise.Deferred#resolve() -> promise.Deferred#fulfill()
- FIXED: remote.SeleniumServer#stop now shuts down within the active control
flow, allowing scripts
to finish. Use #kill to shutdown immediately.
* FIXED: 5321: cookie deletion commands
- FIXED: 5321: cookie deletion commands
## v2.31.0
* Added an example script.
* Added a class for controlling the standalone Selenium server (server available separately)
* Added a portprober for finding free ports
* FIXED: WebElements now belong to the same flow as their parent driver.
- Added an example script.
- Added a class for controlling the standalone Selenium server (server available
separately)
- Added a portprober for finding free ports
- FIXED: WebElements now belong to the same flow as their parent driver.
## v2.30.0
* Ensures promise rejections are always Error values.
* Version bump to keep in sync with the Selenium project.
- Ensures promise rejections are always Error values.
- Version bump to keep in sync with the Selenium project.
## v2.29.1
* Fixed a bug that could lead to an infinite loop.
* Added a README.md
- Fixed a bug that could lead to an infinite loop.
- Added a README.md
## v2.29.0
* Initial release for npm:
- Initial release for npm:
npm install selenium-webdriver

@@ -290,2 +290,3 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

}
checkArg(width)

@@ -292,0 +293,0 @@ checkArg(height)

@@ -21,2 +21,3 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

const RESPONSE_TIMEOUT = 1000 * 30
class CDPConnection {

@@ -23,0 +24,0 @@ constructor(wsConnection) {

@@ -88,2 +88,3 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

}
exports.HttpResponse = HttpResponse

@@ -75,2 +75,3 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

checkServerStatus()
function checkServerStatus() {

@@ -77,0 +78,0 @@ return getStatus(url).then((status) => resolve(status), onError)

@@ -90,35 +90,35 @@ // GENERATED CODE - DO NOT EDIT

seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};var Pc="backgroundColor borderTopColor borderRightColor borderBottomColor borderLeftColor color outlineColor".split(" "),Qc=/#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/,Rc=/^#(?:[0-9a-f]{3}){1,2}$/i,Sc=/^(?:rgba)?\((\d{1,3}),\s?(\d{1,3}),\s?(\d{1,3}),\s?(0|1|0\.\d*)\)$/i,Tc=/^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i;function Uc(a,b){b=b.toLowerCase();return"style"==b?Vc(a.style.cssText):Lc&&"value"==b&&S(a,"INPUT")?a.value:Mc&&!0===a[b]?String(a.getAttribute(b)):(a=a.getAttributeNode(b))&&a.specified?a.value:null}var Wc=/[;]+(?=(?:(?:[^"]*"){2})*[^"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:[^()]*\([^()]*\))*[^()]*$)/;
function Vc(a){var b=[];l(a.split(Wc),function(c){var d=c.indexOf(":");0<d&&(c=[c.slice(0,d),c.slice(d+1)],2==c.length&&b.push(c[0].toLowerCase(),":",c[1],";"))});b=b.join("");return b=";"==b.charAt(b.length-1)?b:b+";"}function S(a,b){b&&"string"!==typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)};var T={};T.I=function(){var a={da:"http://www.w3.org/2000/svg"};return function(b){return a[b]||null}}();
T.s=function(a,b,c){var d=A(a);if(!d.documentElement)return null;(t||Hc)&&Ac(d?d.parentWindow||d.defaultView:window);try{var e=d.createNSResolver?d.createNSResolver(d.documentElement):T.I;if(t&&!Ua(7))return d.evaluate.call(d,b,a,e,c,null);if(!t||9<=Number(w)){for(var f={},g=d.getElementsByTagName("*"),h=0;h<g.length;++h){var n=g[h],u=n.namespaceURI;if(u&&!f[u]){var p=n.lookupPrefix(u);if(!p){var G=u.match(".*/(\\w+)/?$");p=G?G[1]:"xhtml"}f[u]=p}}var R={},fa;for(fa in f)R[f[fa]]=fa;e=function(m){return R[m]||
null}}try{return d.evaluate(b,a,e,c,null)}catch(m){if("TypeError"===m.name)return e=d.createNSResolver?d.createNSResolver(d.documentElement):T.I,d.evaluate(b,a,e,c,null);throw m;}}catch(m){if(!Na||"NS_ERROR_ILLEGAL_VALUE"!=m.name)throw new P(32,"Unable to locate an element with the xpath expression "+b+" because of the following error:\n"+m);}};T.J=function(a,b){if(!a||1!=a.nodeType)throw new P(32,'The result of the xpath expression "'+b+'" is: '+a+". It should be an element.");};
T.o=function(a,b){var c=function(){var d=T.s(b,a,9);return d?d.singleNodeValue||null:b.selectSingleNode?(d=A(b),d.setProperty&&d.setProperty("SelectionLanguage","XPath"),b.selectSingleNode(a)):null}();null===c||T.J(c,a);return c};
T.j=function(a,b){var c=function(){var d=T.s(b,a,7);if(d){for(var e=d.snapshotLength,f=[],g=0;g<e;++g)f.push(d.snapshotItem(g));return f}return b.selectNodes?(d=A(b),d.setProperty&&d.setProperty("SelectionLanguage","XPath"),b.selectNodes(a)):[]}();l(c,function(d){T.J(d,a)});return c};function Xc(a,b,c,d){this.c=a;this.a=b;this.b=c;this.f=d}Xc.prototype.ceil=function(){this.c=Math.ceil(this.c);this.a=Math.ceil(this.a);this.b=Math.ceil(this.b);this.f=Math.ceil(this.f);return this};Xc.prototype.floor=function(){this.c=Math.floor(this.c);this.a=Math.floor(this.a);this.b=Math.floor(this.b);this.f=Math.floor(this.f);return this};Xc.prototype.round=function(){this.c=Math.round(this.c);this.a=Math.round(this.a);this.b=Math.round(this.b);this.f=Math.round(this.f);return this};function U(a,b,c,d){this.a=a;this.b=b;this.width=c;this.height=d}U.prototype.ceil=function(){this.a=Math.ceil(this.a);this.b=Math.ceil(this.b);this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};U.prototype.floor=function(){this.a=Math.floor(this.a);this.b=Math.floor(this.b);this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};
U.prototype.round=function(){this.a=Math.round(this.a);this.b=Math.round(this.b);this.width=Math.round(this.width);this.height=Math.round(this.height);return this};var Yc="function"===typeof ShadowRoot;function Zc(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return S(a)?a:null}
function V(a,b){b=Ha(b);if("float"==b||"cssFloat"==b||"styleFloat"==b)b=Mc?"styleFloat":"cssFloat";a:{var c=b;var d=A(a);if(d.defaultView&&d.defaultView.getComputedStyle&&(d=d.defaultView.getComputedStyle(a,null))){c=d[c]||d.getPropertyValue(c)||"";break a}c=""}a=c||$c(a,b);if(null===a)a=null;else if(0<=oa(Pc,b)){b:{var e=a.match(Sc);if(e&&(b=Number(e[1]),c=Number(e[2]),d=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b,c,d,e];break b}b=null}if(!b)b:{if(d=a.match(Tc))if(b=
function Vc(a){var b=[];l(a.split(Wc),function(c){var d=c.indexOf(":");0<d&&(c=[c.slice(0,d),c.slice(d+1)],2==c.length&&b.push(c[0].toLowerCase(),":",c[1],";"))});b=b.join("");return b=";"==b.charAt(b.length-1)?b:b+";"}function S(a,b){b&&"string"!==typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)};function Xc(a,b,c,d){this.c=a;this.a=b;this.b=c;this.f=d}Xc.prototype.ceil=function(){this.c=Math.ceil(this.c);this.a=Math.ceil(this.a);this.b=Math.ceil(this.b);this.f=Math.ceil(this.f);return this};Xc.prototype.floor=function(){this.c=Math.floor(this.c);this.a=Math.floor(this.a);this.b=Math.floor(this.b);this.f=Math.floor(this.f);return this};Xc.prototype.round=function(){this.c=Math.round(this.c);this.a=Math.round(this.a);this.b=Math.round(this.b);this.f=Math.round(this.f);return this};function T(a,b,c,d){this.a=a;this.b=b;this.width=c;this.height=d}T.prototype.ceil=function(){this.a=Math.ceil(this.a);this.b=Math.ceil(this.b);this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};T.prototype.floor=function(){this.a=Math.floor(this.a);this.b=Math.floor(this.b);this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};
T.prototype.round=function(){this.a=Math.round(this.a);this.b=Math.round(this.b);this.width=Math.round(this.width);this.height=Math.round(this.height);return this};var Yc="function"===typeof ShadowRoot;function Zc(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return S(a)?a:null}
function U(a,b){b=Ha(b);if("float"==b||"cssFloat"==b||"styleFloat"==b)b=Mc?"styleFloat":"cssFloat";a:{var c=b;var d=A(a);if(d.defaultView&&d.defaultView.getComputedStyle&&(d=d.defaultView.getComputedStyle(a,null))){c=d[c]||d.getPropertyValue(c)||"";break a}c=""}a=c||$c(a,b);if(null===a)a=null;else if(0<=oa(Pc,b)){b:{var e=a.match(Sc);if(e&&(b=Number(e[1]),c=Number(e[2]),d=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b,c,d,e];break b}b=null}if(!b)b:{if(d=a.match(Tc))if(b=
Number(d[1]),c=Number(d[2]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c=Oc[b.toLowerCase()];if(!c&&(c="#"==b.charAt(0)?b:"#"+b,4==c.length&&(c=c.replace(Qc,"#$1$1$2$2$3$3")),!Rc.test(c))){b=null;break b}b=[parseInt(c.substr(1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(5,2),16),1]}a=b?"rgba("+b.join(", ")+")":a}return a}
function $c(a,b){var c=a.currentStyle||a.style,d=c[b];void 0===d&&ea(c.getPropertyValue)&&(d=c.getPropertyValue(b));return"inherit"!=d?void 0!==d?d:null:(a=Zc(a))?$c(a,b):null}
function ad(a,b,c){function d(g){var h=W(g);return 0<h.height&&0<h.width?!0:S(g,"PATH")&&(0<h.height||0<h.width)?(g=V(g,"stroke-width"),!!g&&0<parseInt(g,10)):"hidden"!=V(g,"overflow")&&sa(g.childNodes,function(n){return 3==n.nodeType||S(n)&&d(n)})}function e(g){return bd(g)==X&&ta(g.childNodes,function(h){return!S(h)||e(h)||!d(h)})}if(!S(a))throw Error("Argument to isShown must be of type Element");if(S(a,"BODY"))return!0;if(S(a,"OPTION")||S(a,"OPTGROUP"))return a=lb(a,function(g){return S(g,"SELECT")}),
!!a&&ad(a,!0,c);var f=cd(a);if(f)return!!f.image&&0<f.rect.width&&0<f.rect.height&&ad(f.image,b,c);if(S(a,"INPUT")&&"hidden"==a.type.toLowerCase()||S(a,"NOSCRIPT"))return!1;f=V(a,"visibility");return"collapse"!=f&&"hidden"!=f&&c(a)&&(b||0!=dd(a))&&d(a)?!e(a):!1}
function ed(a){function b(c){if(S(c)&&"none"==V(c,"display"))return!1;var d;if((d=c.parentNode)&&d.shadowRoot&&void 0!==c.assignedSlot)d=c.assignedSlot?c.assignedSlot.parentNode:null;else if(c.getDestinationInsertionPoints){var e=c.getDestinationInsertionPoints();0<e.length&&(d=e[e.length-1])}if(Yc&&d instanceof ShadowRoot){if(d.host.shadowRoot&&d.host.shadowRoot!==d)return!1;d=d.host}return!d||9!=d.nodeType&&11!=d.nodeType?d&&S(d,"DETAILS")&&!d.open&&!S(c,"SUMMARY")?!1:!!d&&b(d):!0}return ad(a,!1,
b)}var X="hidden";
function bd(a){function b(m){function v(Ab){if(Ab==g)return!0;var pc=V(Ab,"display");return 0==pc.lastIndexOf("inline",0)||"contents"==pc||"absolute"==qc&&"static"==V(Ab,"position")?!1:!0}var qc=V(m,"position");if("fixed"==qc)return u=!0,m==g?null:g;for(m=Zc(m);m&&!v(m);)m=Zc(m);return m}function c(m){var v=m;if("visible"==n)if(m==g&&h)v=h;else if(m==h)return{x:"visible",y:"visible"};v={x:V(v,"overflow-x"),y:V(v,"overflow-y")};m==g&&(v.x="visible"==v.x?"auto":v.x,v.y="visible"==v.y?"auto":v.y);return v}
function d(m){if(m==g){var v=(new fb(f)).a;m=v.scrollingElement?v.scrollingElement:Oa||"CSS1Compat"!=v.compatMode?v.body||v.documentElement:v.documentElement;v=v.parentWindow||v.defaultView;m=t&&Ua("10")&&v.pageYOffset!=m.scrollTop?new cb(m.scrollLeft,m.scrollTop):new cb(v.pageXOffset||m.scrollLeft,v.pageYOffset||m.scrollTop)}else m=new cb(m.scrollLeft,m.scrollTop);return m}var e=fd(a),f=A(a),g=f.documentElement,h=f.body,n=V(g,"overflow"),u;for(a=b(a);a;a=b(a)){var p=c(a);if("visible"!=p.x||"visible"!=
p.y){var G=W(a);if(0==G.width||0==G.height)return X;var R=e.a<G.a,fa=e.b<G.b;if(R&&"hidden"==p.x||fa&&"hidden"==p.y)return X;if(R&&"visible"!=p.x||fa&&"visible"!=p.y){R=d(a);fa=e.b<G.b-R.y;if(e.a<G.a-R.x&&"visible"!=p.x||fa&&"visible"!=p.x)return X;e=bd(a);return e==X?X:"scroll"}R=e.f>=G.a+G.width;G=e.c>=G.b+G.height;if(R&&"hidden"==p.x||G&&"hidden"==p.y)return X;if(R&&"visible"!=p.x||G&&"visible"!=p.y){if(u&&(p=d(a),e.f>=g.scrollWidth-p.x||e.a>=g.scrollHeight-p.y))return X;e=bd(a);return e==X?X:
function ad(a,b,c){function d(g){var h=V(g);return 0<h.height&&0<h.width?!0:S(g,"PATH")&&(0<h.height||0<h.width)?(g=U(g,"stroke-width"),!!g&&0<parseInt(g,10)):"hidden"!=U(g,"overflow")&&sa(g.childNodes,function(n){return 3==n.nodeType||S(n)&&d(n)})}function e(g){return bd(g)==W&&ta(g.childNodes,function(h){return!S(h)||e(h)||!d(h)})}if(!S(a))throw Error("Argument to isShown must be of type Element");if(S(a,"BODY"))return!0;if(S(a,"OPTION")||S(a,"OPTGROUP"))return a=lb(a,function(g){return S(g,"SELECT")}),
!!a&&ad(a,!0,c);var f=cd(a);if(f)return!!f.image&&0<f.rect.width&&0<f.rect.height&&ad(f.image,b,c);if(S(a,"INPUT")&&"hidden"==a.type.toLowerCase()||S(a,"NOSCRIPT"))return!1;f=U(a,"visibility");return"collapse"!=f&&"hidden"!=f&&c(a)&&(b||0!=dd(a))&&d(a)?!e(a):!1}
function ed(a){function b(c){if(S(c)&&"none"==U(c,"display"))return!1;var d;if((d=c.parentNode)&&d.shadowRoot&&void 0!==c.assignedSlot)d=c.assignedSlot?c.assignedSlot.parentNode:null;else if(c.getDestinationInsertionPoints){var e=c.getDestinationInsertionPoints();0<e.length&&(d=e[e.length-1])}if(Yc&&d instanceof ShadowRoot){if(d.host.shadowRoot&&d.host.shadowRoot!==d)return!1;d=d.host}return!d||9!=d.nodeType&&11!=d.nodeType?d&&S(d,"DETAILS")&&!d.open&&!S(c,"SUMMARY")?!1:!!d&&b(d):!0}return ad(a,!1,
b)}var W="hidden";
function bd(a){function b(m){function v(Ab){if(Ab==g)return!0;var pc=U(Ab,"display");return 0==pc.lastIndexOf("inline",0)||"contents"==pc||"absolute"==qc&&"static"==U(Ab,"position")?!1:!0}var qc=U(m,"position");if("fixed"==qc)return u=!0,m==g?null:g;for(m=Zc(m);m&&!v(m);)m=Zc(m);return m}function c(m){var v=m;if("visible"==n)if(m==g&&h)v=h;else if(m==h)return{x:"visible",y:"visible"};v={x:U(v,"overflow-x"),y:U(v,"overflow-y")};m==g&&(v.x="visible"==v.x?"auto":v.x,v.y="visible"==v.y?"auto":v.y);return v}
function d(m){if(m==g){var v=(new fb(f)).a;m=v.scrollingElement?v.scrollingElement:Oa||"CSS1Compat"!=v.compatMode?v.body||v.documentElement:v.documentElement;v=v.parentWindow||v.defaultView;m=t&&Ua("10")&&v.pageYOffset!=m.scrollTop?new cb(m.scrollLeft,m.scrollTop):new cb(v.pageXOffset||m.scrollLeft,v.pageYOffset||m.scrollTop)}else m=new cb(m.scrollLeft,m.scrollTop);return m}var e=fd(a),f=A(a),g=f.documentElement,h=f.body,n=U(g,"overflow"),u;for(a=b(a);a;a=b(a)){var p=c(a);if("visible"!=p.x||"visible"!=
p.y){var G=V(a);if(0==G.width||0==G.height)return W;var R=e.a<G.a,fa=e.b<G.b;if(R&&"hidden"==p.x||fa&&"hidden"==p.y)return W;if(R&&"visible"!=p.x||fa&&"visible"!=p.y){R=d(a);fa=e.b<G.b-R.y;if(e.a<G.a-R.x&&"visible"!=p.x||fa&&"visible"!=p.x)return W;e=bd(a);return e==W?W:"scroll"}R=e.f>=G.a+G.width;G=e.c>=G.b+G.height;if(R&&"hidden"==p.x||G&&"hidden"==p.y)return W;if(R&&"visible"!=p.x||G&&"visible"!=p.y){if(u&&(p=d(a),e.f>=g.scrollWidth-p.x||e.a>=g.scrollHeight-p.y))return W;e=bd(a);return e==W?W:
"scroll"}}}return"none"}
function W(a){var b=cd(a);if(b)return b.rect;if(S(a,"HTML"))return a=A(a),a=((a?a.parentWindow||a.defaultView:window)||window).document,a="CSS1Compat"==a.compatMode?a.documentElement:a.body,a=new db(a.clientWidth,a.clientHeight),new U(0,0,a.width,a.height);try{var c=a.getBoundingClientRect()}catch(d){return new U(0,0,0,0)}b=new U(c.left,c.top,c.right-c.left,c.bottom-c.top);t&&a.ownerDocument.body&&(a=A(a),b.a-=a.documentElement.clientLeft+a.body.clientLeft,b.b-=a.documentElement.clientTop+a.body.clientTop);
return b}function cd(a){var b=S(a,"MAP");if(!b&&!S(a,"AREA"))return null;var c=b?a:S(a.parentNode,"MAP")?a.parentNode:null,d=null,e=null;c&&c.name&&(d=T.o('/descendant::*[@usemap = "#'+c.name+'"]',A(c)))&&(e=W(d),b||"default"==a.shape.toLowerCase()||(a=gd(a),b=Math.min(Math.max(a.a,0),e.width),c=Math.min(Math.max(a.b,0),e.height),e=new U(b+e.a,c+e.b,Math.min(a.width,e.width-b),Math.min(a.height,e.height-c))));return{image:d,rect:e||new U(0,0,0,0)}}
function gd(a){var b=a.shape.toLowerCase();a=a.coords.split(",");if("rect"==b&&4==a.length){b=a[0];var c=a[1];return new U(b,c,a[2]-b,a[3]-c)}if("circle"==b&&3==a.length)return b=a[2],new U(a[0]-b,a[1]-b,2*b,2*b);if("poly"==b&&2<a.length){b=a[0];c=a[1];for(var d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=Math.min(c,a[f+1]),e=Math.max(e,a[f+1]);return new U(b,c,d-b,e-c)}return new U(0,0,0,0)}function fd(a){a=W(a);return new Xc(a.b,a.a+a.width,a.b+a.height,a.a)}
function V(a){var b=cd(a);if(b)return b.rect;if(S(a,"HTML"))return a=A(a),a=((a?a.parentWindow||a.defaultView:window)||window).document,a="CSS1Compat"==a.compatMode?a.documentElement:a.body,a=new db(a.clientWidth,a.clientHeight),new T(0,0,a.width,a.height);try{var c=a.getBoundingClientRect()}catch(d){return new T(0,0,0,0)}b=new T(c.left,c.top,c.right-c.left,c.bottom-c.top);t&&a.ownerDocument.body&&(a=A(a),b.a-=a.documentElement.clientLeft+a.body.clientLeft,b.b-=a.documentElement.clientTop+a.body.clientTop);
return b}function cd(a){var b=S(a,"MAP");if(!b&&!S(a,"AREA"))return null;var c=b?a:S(a.parentNode,"MAP")?a.parentNode:null,d=null,e=null;c&&c.name&&(d=Nc.o('*[usemap="#'+c.name+'"]',A(c)))&&(e=V(d),b||"default"==a.shape.toLowerCase()||(a=gd(a),b=Math.min(Math.max(a.a,0),e.width),c=Math.min(Math.max(a.b,0),e.height),e=new T(b+e.a,c+e.b,Math.min(a.width,e.width-b),Math.min(a.height,e.height-c))));return{image:d,rect:e||new T(0,0,0,0)}}
function gd(a){var b=a.shape.toLowerCase();a=a.coords.split(",");if("rect"==b&&4==a.length){b=a[0];var c=a[1];return new T(b,c,a[2]-b,a[3]-c)}if("circle"==b&&3==a.length)return b=a[2],new T(a[0]-b,a[1]-b,2*b,2*b);if("poly"==b&&2<a.length){b=a[0];c=a[1];for(var d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=Math.min(c,a[f+1]),e=Math.max(e,a[f+1]);return new T(b,c,d-b,e-c)}return new T(0,0,0,0)}function fd(a){a=V(a);return new Xc(a.b,a.a+a.width,a.b+a.height,a.a)}
function hd(a){return a.replace(/^[^\S\xa0]+|[^\S\xa0]+$/g,"")}function id(a){var b=[];Yc?jd(a,b):kd(a,b);a=qa(b,hd);return hd(a.join("\n")).replace(/\xa0/g," ")}
function ld(a,b,c){if(S(a,"BR"))b.push("");else{var d=S(a,"TD"),e=V(a,"display"),f=!d&&!(0<=oa(md,e)),g=void 0!==a.previousElementSibling?a.previousElementSibling:gb(a.previousSibling);g=g?V(g,"display"):"";var h=V(a,"float")||V(a,"cssFloat")||V(a,"styleFloat");!f||"run-in"==g&&"none"==h||/^[\s\xa0]*$/.test(b[b.length-1]||"")||b.push("");var n=ed(a),u=null,p=null;n&&(u=V(a,"white-space"),p=V(a,"text-transform"));l(a.childNodes,function(G){c(G,b,n,u,p)});a=b[b.length-1]||"";!d&&"table-cell"!=e||!a||
function ld(a,b,c){if(S(a,"BR"))b.push("");else{var d=S(a,"TD"),e=U(a,"display"),f=!d&&!(0<=oa(md,e)),g=void 0!==a.previousElementSibling?a.previousElementSibling:gb(a.previousSibling);g=g?U(g,"display"):"";var h=U(a,"float")||U(a,"cssFloat")||U(a,"styleFloat");!f||"run-in"==g&&"none"==h||/^[\s\xa0]*$/.test(b[b.length-1]||"")||b.push("");var n=ed(a),u=null,p=null;n&&(u=U(a,"white-space"),p=U(a,"text-transform"));l(a.childNodes,function(G){c(G,b,n,u,p)});a=b[b.length-1]||"";!d&&"table-cell"!=e||!a||
za(a)||(b[b.length-1]+=" ");f&&"run-in"!=e&&!/^[\s\xa0]*$/.test(a)&&b.push("")}}function kd(a,b){ld(a,b,function(c,d,e,f,g){3==c.nodeType&&e?nd(c,d,f,g):S(c)&&kd(c,d)})}var md="inline inline-block inline-table none table-cell table-column table-column-group".split(" ");
function nd(a,b,c,d){a=a.nodeValue.replace(/[\u200b\u200e\u200f]/g,"");a=a.replace(/(\r\n|\r|\n)/g,"\n");if("normal"==c||"nowrap"==c)a=a.replace(/\n/g," ");a="pre"==c||"pre-wrap"==c?a.replace(/[ \f\t\v\u2028\u2029]/g,"\u00a0"):a.replace(/[ \f\t\v\u2028\u2029]+/g," ");"capitalize"==d?a=a.replace(t?/(^|\s|\b)(\S)/g:/(^|[^\d\p{L}\p{S}])([\p{Ll}|\p{S}])/gu,function(e,f,g){return f+g.toUpperCase()}):"uppercase"==d?a=a.toUpperCase():"lowercase"==d&&(a=a.toLowerCase());c=b.pop()||"";za(c)&&0==a.lastIndexOf(" ",
0)&&(a=a.substr(1));b.push(c+a)}function dd(a){if(Mc){if("relative"==V(a,"position"))return 1;a=V(a,"filter");return(a=a.match(/^alpha\(opacity=(\d*)\)/)||a.match(/^progid:DXImageTransform.Microsoft.Alpha\(Opacity=(\d*)\)/))?Number(a[1])/100:1}return od(a)}function od(a){var b=1,c=V(a,"opacity");c&&(b=Number(c));(a=Zc(a))&&(b*=od(a));return b}
0)&&(a=a.substr(1));b.push(c+a)}function dd(a){if(Mc){if("relative"==U(a,"position"))return 1;a=U(a,"filter");return(a=a.match(/^alpha\(opacity=(\d*)\)/)||a.match(/^progid:DXImageTransform.Microsoft.Alpha\(Opacity=(\d*)\)/))?Number(a[1])/100:1}return od(a)}function od(a){var b=1,c=U(a,"opacity");c&&(b=Number(c));(a=Zc(a))&&(b*=od(a));return b}
function pd(a,b,c,d,e){if(3==a.nodeType&&c)nd(a,b,d,e);else if(S(a))if(S(a,"CONTENT")||S(a,"SLOT")){for(var f=a;f.parentNode;)f=f.parentNode;f instanceof ShadowRoot?(f=S(a,"CONTENT")?a.getDistributedNodes():a.assignedNodes(),l(0<f.length?f:a.childNodes,function(g){pd(g,b,c,d,e)})):jd(a,b)}else if(S(a,"SHADOW")){for(f=a;f.parentNode;)f=f.parentNode;if(f instanceof ShadowRoot&&(a=f))for(a=a.olderShadowRoot;a;)l(a.childNodes,function(g){pd(g,b,c,d,e)}),a=a.olderShadowRoot}else jd(a,b)}
function jd(a,b){a.shadowRoot&&l(a.shadowRoot.childNodes,function(c){pd(c,b,!0,null,null)});ld(a,b,function(c,d,e,f,g){var h=null;1==c.nodeType?h=c:3==c.nodeType&&(h=c);null!=h&&(null!=h.assignedSlot||h.getDestinationInsertionPoints&&0<h.getDestinationInsertionPoints().length)||pd(c,d,e,f,g)})};var qd={C:function(a,b){return!(!a.querySelectorAll||!a.querySelector)&&!/^\d.*/.test(b)},o:function(a,b){var c=eb(b),d="string"===typeof a?c.a.getElementById(a):a;return d?Uc(d,"id")==a&&b!=d&&hb(b,d)?d:ua(mb(c,"*"),function(e){return Uc(e,"id")==a&&b!=e&&hb(b,e)}):null},j:function(a,b){if(!a)return[];if(qd.C(b,a))try{return b.querySelectorAll("#"+qd.T(a))}catch(c){return[]}b=mb(eb(b),"*",null,b);return pa(b,function(c){return Uc(c,"id")==a})},T:function(a){return a.replace(/([\s'"\\#.:;,!?+<>=~*^$|%&@`{}\-\/\[\]\(\)])/g,
"\\$1")}};var Y={},rd={};Y.N=function(a,b,c){try{var d=Nc.j("a",b)}catch(e){d=mb(eb(b),"A",null,b)}return ua(d,function(e){e=id(e);e=e.replace(/^[\s]+|[\s]+$/g,"");return c&&-1!=e.indexOf(a)||e==a})};Y.K=function(a,b,c){try{var d=Nc.j("a",b)}catch(e){d=mb(eb(b),"A",null,b)}return pa(d,function(e){e=id(e);e=e.replace(/^[\s]+|[\s]+$/g,"");return c&&-1!=e.indexOf(a)||e==a})};Y.o=function(a,b){return Y.N(a,b,!1)};Y.j=function(a,b){return Y.K(a,b,!1)};rd.o=function(a,b){return Y.N(a,b,!0)};
rd.j=function(a,b){return Y.K(a,b,!0)};var Z={F:function(a,b){return function(c){var d=Z.u(a);d=W(d);c=W(c);return b.call(null,d,c)}},R:function(a){return Z.F(a,function(b,c){return c.b+c.height<b.b})},S:function(a){return Z.F(a,function(b,c){return b.b+b.height<c.b})},V:function(a){return Z.F(a,function(b,c){return c.a+c.width<b.a})},aa:function(a){return Z.F(a,function(b,c){return b.a+b.width<c.a})},W:function(a,b){var c;b?c=b:"number"==typeof a.distance&&(c=a.distance);c||(c=50);return function(d){var e=Z.u(a);if(e===d)return!1;e=W(e);
d=W(d);e=new U(e.a-c,e.b-c,e.width+2*c,e.height+2*c);return e.a<=d.a+d.width&&d.a<=e.a+e.width&&e.b<=d.b+d.height&&d.b<=e.b+e.height}},u:function(a){if(ha(a)&&1==a.nodeType)return a;if(ea(a))return Z.u(a.call(null));if(ha(a)){var b;a:{if(b=sd(a)){var c=td[b];if(c&&ea(c.o)){b=c.o(a[b],Bc.document);break a}}throw new P(61,"Unsupported locator strategy: "+b);}if(!b)throw new P(7,"No element has been found by "+JSON.stringify(a));return b}throw new P(61,"Selector is of wrong type: "+JSON.stringify(a));
}};Z.P={left:Z.V,right:Z.aa,above:Z.R,below:Z.S,near:Z.W};Z.O={left:Z.u,right:Z.u,above:Z.u,below:Z.u,near:Z.u};Z.U=function(a,b){var c=[];l(a,function(e){e&&ta(b,function(f){var g=f.kind,h=Z.P[g];if(!h)throw new P(61,"Cannot find filter suitable for "+g);return h.apply(null,f.args)(e)},null)&&c.push(e)},null);a=b[b.length-1];var d=Z.O[a?a.kind:"unknown"];return d?(a=d.apply(null,a.args))?Z.ba(a,c):c:c};
Z.ba=function(a,b){function c(f){f=W(f);return Math.sqrt(Math.pow(d-(f.a+Math.max(1,f.width)/2),2)+Math.pow(e-(f.b+Math.max(1,f.height)/2),2))}a=W(a);var d=a.a+Math.max(1,a.width)/2,e=a.b+Math.max(1,a.height)/2;xa(b,function(f,g){return c(f)-c(g)});return b};Z.o=function(a,b){a=Z.j(a,b);return 0==a.length?null:a[0]};
Z.j=function(a,b){if(!a.hasOwnProperty("root")||!a.hasOwnProperty("filters"))throw new P(61,"Locator not suitable for relative locators: "+JSON.stringify(a));var c=a.filters,d=da(c);if("array"!=d&&("object"!=d||"number"!=typeof c.length))throw new P(61,"Targets should be an array: "+JSON.stringify(a));var e;S(a.root)?e=[a.root]:e=ud(a.root,b);return 0==e.length?[]:Z.U(e,a.filters)};var vd={o:function(a,b){if(""===a)throw new P(32,'Unable to locate an element with the tagName ""');return b.getElementsByTagName(a)[0]||null},j:function(a,b){if(""===a)throw new P(32,'Unable to locate an element with the tagName ""');return b.getElementsByTagName(a)}};var td={className:Dc,"class name":Dc,css:Nc,"css selector":Nc,relative:Z,id:qd,linkText:Y,"link text":Y,name:{o:function(a,b){b=mb(eb(b),"*",null,b);return ua(b,function(c){return Uc(c,"name")==a})},j:function(a,b){b=mb(eb(b),"*",null,b);return pa(b,function(c){return Uc(c,"name")==a})}},partialLinkText:rd,"partial link text":rd,tagName:vd,"tag name":vd,xpath:T};function sd(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null}
"\\$1")}};var X={},rd={};X.N=function(a,b,c){try{var d=Nc.j("a",b)}catch(e){d=mb(eb(b),"A",null,b)}return ua(d,function(e){e=id(e);e=e.replace(/^[\s]+|[\s]+$/g,"");return c&&-1!=e.indexOf(a)||e==a})};X.K=function(a,b,c){try{var d=Nc.j("a",b)}catch(e){d=mb(eb(b),"A",null,b)}return pa(d,function(e){e=id(e);e=e.replace(/^[\s]+|[\s]+$/g,"");return c&&-1!=e.indexOf(a)||e==a})};X.o=function(a,b){return X.N(a,b,!1)};X.j=function(a,b){return X.K(a,b,!1)};rd.o=function(a,b){return X.N(a,b,!0)};
rd.j=function(a,b){return X.K(a,b,!0)};var Y={F:function(a,b){return function(c){var d=Y.u(a);d=V(d);c=V(c);return b.call(null,d,c)}},R:function(a){return Y.F(a,function(b,c){return c.b+c.height<b.b})},S:function(a){return Y.F(a,function(b,c){return b.b+b.height<c.b})},V:function(a){return Y.F(a,function(b,c){return c.a+c.width<b.a})},aa:function(a){return Y.F(a,function(b,c){return b.a+b.width<c.a})},W:function(a,b){var c;b?c=b:"number"==typeof a.distance&&(c=a.distance);c||(c=50);return function(d){var e=Y.u(a);if(e===d)return!1;e=V(e);
d=V(d);e=new T(e.a-c,e.b-c,e.width+2*c,e.height+2*c);return e.a<=d.a+d.width&&d.a<=e.a+e.width&&e.b<=d.b+d.height&&d.b<=e.b+e.height}},u:function(a){if(ha(a)&&1==a.nodeType)return a;if(ea(a))return Y.u(a.call(null));if(ha(a)){var b;a:{if(b=sd(a)){var c=td[b];if(c&&ea(c.o)){b=c.o(a[b],Bc.document);break a}}throw new P(61,"Unsupported locator strategy: "+b);}if(!b)throw new P(7,"No element has been found by "+JSON.stringify(a));return b}throw new P(61,"Selector is of wrong type: "+JSON.stringify(a));
}};Y.P={left:Y.V,right:Y.aa,above:Y.R,below:Y.S,near:Y.W};Y.O={left:Y.u,right:Y.u,above:Y.u,below:Y.u,near:Y.u};Y.U=function(a,b){var c=[];l(a,function(e){e&&ta(b,function(f){var g=f.kind,h=Y.P[g];if(!h)throw new P(61,"Cannot find filter suitable for "+g);return h.apply(null,f.args)(e)},null)&&c.push(e)},null);a=b[b.length-1];var d=Y.O[a?a.kind:"unknown"];return d?(a=d.apply(null,a.args))?Y.ba(a,c):c:c};
Y.ba=function(a,b){function c(f){f=V(f);return Math.sqrt(Math.pow(d-(f.a+Math.max(1,f.width)/2),2)+Math.pow(e-(f.b+Math.max(1,f.height)/2),2))}a=V(a);var d=a.a+Math.max(1,a.width)/2,e=a.b+Math.max(1,a.height)/2;xa(b,function(f,g){return c(f)-c(g)});return b};Y.o=function(a,b){a=Y.j(a,b);return 0==a.length?null:a[0]};
Y.j=function(a,b){if(!a.hasOwnProperty("root")||!a.hasOwnProperty("filters"))throw new P(61,"Locator not suitable for relative locators: "+JSON.stringify(a));var c=a.filters,d=da(c);if("array"!=d&&("object"!=d||"number"!=typeof c.length))throw new P(61,"Targets should be an array: "+JSON.stringify(a));var e;S(a.root)?e=[a.root]:e=ud(a.root,b);return 0==e.length?[]:Y.U(e,a.filters)};var vd={o:function(a,b){if(""===a)throw new P(32,'Unable to locate an element with the tagName ""');return b.getElementsByTagName(a)[0]||null},j:function(a,b){if(""===a)throw new P(32,'Unable to locate an element with the tagName ""');return b.getElementsByTagName(a)}};var Z={};Z.I=function(){var a={da:"http://www.w3.org/2000/svg"};return function(b){return a[b]||null}}();
Z.s=function(a,b,c){var d=A(a);if(!d.documentElement)return null;(t||Hc)&&Ac(d?d.parentWindow||d.defaultView:window);try{var e=d.createNSResolver?d.createNSResolver(d.documentElement):Z.I;if(t&&!Ua(7))return d.evaluate.call(d,b,a,e,c,null);if(!t||9<=Number(w)){for(var f={},g=d.getElementsByTagName("*"),h=0;h<g.length;++h){var n=g[h],u=n.namespaceURI;if(u&&!f[u]){var p=n.lookupPrefix(u);if(!p){var G=u.match(".*/(\\w+)/?$");p=G?G[1]:"xhtml"}f[u]=p}}var R={},fa;for(fa in f)R[f[fa]]=fa;e=function(m){return R[m]||
null}}try{return d.evaluate(b,a,e,c,null)}catch(m){if("TypeError"===m.name)return e=d.createNSResolver?d.createNSResolver(d.documentElement):Z.I,d.evaluate(b,a,e,c,null);throw m;}}catch(m){if(!Na||"NS_ERROR_ILLEGAL_VALUE"!=m.name)throw new P(32,"Unable to locate an element with the xpath expression "+b+" because of the following error:\n"+m);}};Z.J=function(a,b){if(!a||1!=a.nodeType)throw new P(32,'The result of the xpath expression "'+b+'" is: '+a+". It should be an element.");};
Z.o=function(a,b){var c=function(){var d=Z.s(b,a,9);return d?d.singleNodeValue||null:b.selectSingleNode?(d=A(b),d.setProperty&&d.setProperty("SelectionLanguage","XPath"),b.selectSingleNode(a)):null}();null===c||Z.J(c,a);return c};
Z.j=function(a,b){var c=function(){var d=Z.s(b,a,7);if(d){for(var e=d.snapshotLength,f=[],g=0;g<e;++g)f.push(d.snapshotItem(g));return f}return b.selectNodes?(d=A(b),d.setProperty&&d.setProperty("SelectionLanguage","XPath"),b.selectNodes(a)):[]}();l(c,function(d){Z.J(d,a)});return c};var td={className:Dc,"class name":Dc,css:Nc,"css selector":Nc,relative:Y,id:qd,linkText:X,"link text":X,name:{o:function(a,b){b=mb(eb(b),"*",null,b);return ua(b,function(c){return Uc(c,"name")==a})},j:function(a,b){b=mb(eb(b),"*",null,b);return pa(b,function(c){return Uc(c,"name")==a})}},partialLinkText:rd,"partial link text":rd,tagName:vd,"tag name":vd,xpath:Z};function sd(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null}
function ud(a,b){var c=sd(a);if(c){var d=td[c];if(d&&ea(d.j))return d.j(a[c],b||Bc.document)}throw new P(61,"Unsupported locator strategy: "+c);};ca("_",ud);; return this._.apply(null,arguments);}).apply({navigator:typeof window!='undefined'?window.navigator:null,document:typeof window!='undefined'?window.document:null}, arguments);};
// GENERATED CODE - DO NOT EDIT
module.exports = function(){return (function(){var k=this||self;function aa(a){return"string"==typeof a}function ba(a,b){a=a.split(".");var c=k;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c[d]&&c[d]!==Object.prototype[d]?c=c[d]:c=c[d]={}:c[d]=b}
function ca(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
else if("function"==b&&"undefined"==typeof a.call)return"object";return b}function da(a,b,c){return a.call.apply(a.bind,arguments)}function ea(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);return function(){var e=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(e,d);return a.apply(b,e)}}return function(){return a.apply(b,arguments)}}
function fa(a,b,c){Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?fa=da:fa=ea;return fa.apply(null,arguments)}function ha(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function l(a,b){function c(){}c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a};/*
The MIT License
Copyright (c) 2007 Cybozu Labs, Inc.
Copyright (c) 2012 Google Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
function ia(a,b,c){this.a=a;this.b=b||1;this.f=c||1};var ja=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},n=Array.prototype.forEach?function(a,b){Array.prototype.forEach.call(a,b,void 0)}:function(a,b){for(var c=a.length,d="string"===typeof a?a.split(""):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)},ka=Array.prototype.filter?function(a,b){return Array.prototype.filter.call(a,
b,void 0)}:function(a,b){for(var c=a.length,d=[],e=0,f="string"===typeof a?a.split(""):a,g=0;g<c;g++)if(g in f){var h=f[g];b.call(void 0,h,g,a)&&(d[e++]=h)}return d},la=Array.prototype.reduce?function(a,b,c){return Array.prototype.reduce.call(a,b,c)}:function(a,b,c){var d=c;n(a,function(e,f){d=b.call(void 0,d,e,f,a)});return d},ma=Array.prototype.some?function(a,b){return Array.prototype.some.call(a,b,void 0)}:function(a,b){for(var c=a.length,d="string"===typeof a?a.split(""):a,e=0;e<c;e++)if(e in
d&&b.call(void 0,d[e],e,a))return!0;return!1},na=Array.prototype.every?function(a,b){return Array.prototype.every.call(a,b,void 0)}:function(a,b){for(var c=a.length,d="string"===typeof a?a.split(""):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,d[e],e,a))return!1;return!0};function oa(a,b){a:{for(var c=a.length,d="string"===typeof a?a.split(""):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a)){b=e;break a}b=-1}return 0>b?null:"string"===typeof a?a.charAt(b):a[b]}
function pa(a){return Array.prototype.concat.apply([],arguments)}function qa(a,b,c){return 2>=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};var ra=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]};function sa(a,b){return a<b?-1:a>b?1:0};var t;a:{var ta=k.navigator;if(ta){var ua=ta.userAgent;if(ua){t=ua;break a}}t=""}function u(a){return-1!=t.indexOf(a)};function va(){return u("Firefox")||u("FxiOS")}function wa(){return(u("Chrome")||u("CriOS"))&&!u("Edge")};function xa(a){return String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()})};function ya(){return u("iPhone")&&!u("iPod")&&!u("iPad")};function za(a,b){var c=Aa;return Object.prototype.hasOwnProperty.call(c,a)?c[a]:c[a]=b(a)};var Ba=u("Opera"),v=u("Trident")||u("MSIE"),Ca=u("Edge"),Da=u("Gecko")&&!(-1!=t.toLowerCase().indexOf("webkit")&&!u("Edge"))&&!(u("Trident")||u("MSIE"))&&!u("Edge"),Ea=-1!=t.toLowerCase().indexOf("webkit")&&!u("Edge");function Fa(){var a=k.document;return a?a.documentMode:void 0}var Ga;
a:{var Ha="",Ia=function(){var a=t;if(Da)return/rv:([^\);]+)(\)|;)/.exec(a);if(Ca)return/Edge\/([\d\.]+)/.exec(a);if(v)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ea)return/WebKit\/(\S+)/.exec(a);if(Ba)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Ia&&(Ha=Ia?Ia[1]:"");if(v){var Ja=Fa();if(null!=Ja&&Ja>parseFloat(Ha)){Ga=String(Ja);break a}}Ga=Ha}var Aa={};
function Ka(a){return za(a,function(){for(var b=0,c=ra(String(Ga)).split("."),d=ra(String(a)).split("."),e=Math.max(c.length,d.length),f=0;0==b&&f<e;f++){var g=c[f]||"",h=d[f]||"";do{g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];h=/(\d*)(\D*)(.*)/.exec(h)||["","","",""];if(0==g[0].length&&0==h[0].length)break;b=sa(0==g[1].length?0:parseInt(g[1],10),0==h[1].length?0:parseInt(h[1],10))||sa(0==g[2].length,0==h[2].length)||sa(g[2],h[2]);g=g[3];h=h[3]}while(0==b)}return 0<=b})}var La;
La=k.document&&v?Fa():void 0;var x=v&&!(9<=Number(La)),Ma=v&&!(8<=Number(La));function Na(a,b,c,d){this.a=a;this.nodeName=c;this.nodeValue=d;this.nodeType=2;this.parentNode=this.ownerElement=b}function Oa(a,b){var c=Ma&&"href"==b.nodeName?a.getAttribute(b.nodeName,2):b.nodeValue;return new Na(b,a,b.nodeName,c)};function Pa(a){this.b=a;this.a=0}function Qa(a){a=a.match(Ra);for(var b=0;b<a.length;b++)Sa.test(a[b])&&a.splice(b,1);return new Pa(a)}var Ra=/\$?(?:(?![0-9-\.])(?:\*|[\w-\.]+):)?(?![0-9-\.])(?:\*|[\w-\.]+)|\/\/|\.\.|::|\d+(?:\.\d*)?|\.\d+|"[^"]*"|'[^']*'|[!<>]=|\s+|./g,Sa=/^\s/;function y(a,b){return a.b[a.a+(b||0)]}function z(a){return a.b[a.a++]}function Ta(a){return a.b.length<=a.a};function Ua(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b?b:0}Ua.prototype.ceil=function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};Ua.prototype.floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};Ua.prototype.round=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this};function Va(a,b){this.width=a;this.height=b}Va.prototype.aspectRatio=function(){return this.width/this.height};Va.prototype.ceil=function(){this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};Va.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};Va.prototype.round=function(){this.width=Math.round(this.width);this.height=Math.round(this.height);return this};function Wa(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if("undefined"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}
function Xa(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.compareDocumentPosition(b)&2?1:-1;if(v&&!(9<=Number(La))){if(9==a.nodeType)return-1;if(9==b.nodeType)return 1}if("sourceIndex"in a||a.parentNode&&"sourceIndex"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return e==f?Ya(a,b):!c&&Wa(e,b)?-1*Za(a,b):!d&&Wa(f,a)?Za(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=A(a);c=d.createRange();
c.selectNode(a);c.collapse(!0);a=d.createRange();a.selectNode(b);a.collapse(!0);return c.compareBoundaryPoints(k.Range.START_TO_END,a)}function Za(a,b){var c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return Ya(b,a)}function Ya(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return 1}function A(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function $a(a,b){a&&(a=a.parentNode);for(var c=0;a;){if(b(a))return a;a=a.parentNode;c++}return null}
function ab(a){this.a=a||k.document||document}ab.prototype.getElementsByTagName=function(a,b){return(b||this.a).getElementsByTagName(String(a))};function B(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?"":b);if("string"!=typeof b)if(x&&"title"==a.nodeName.toLowerCase()&&1==c)b=a.text;else if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;c=0;var d=[];for(b="";a;){do 1!=a.nodeType&&(b+=a.nodeValue),x&&"title"==a.nodeName.toLowerCase()&&(b+=a.text),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.nodeValue;return b}
function C(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)return!1}catch(d){return!1}Ma&&"class"==b&&(b="className");return null==c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function bb(a,b,c,d,e){return(x?cb:db).call(null,a,b,aa(c)?c:null,aa(d)?d:null,e||new E)}
function cb(a,b,c,d,e){if(a instanceof F||8==a.b||c&&null===a.b){var f=b.all;if(!f)return e;a=eb(a);if("*"!=a&&(f=b.getElementsByTagName(a),!f))return e;if(c){for(var g=[],h=0;b=f[h++];)C(b,c,d)&&g.push(b);f=g}for(h=0;b=f[h++];)"*"==a&&"!"==b.tagName||e.add(b);return e}gb(a,b,c,d,e);return e}
function db(a,b,c,d,e){b.getElementsByName&&d&&"name"==c&&!v?(b=b.getElementsByName(d),n(b,function(f){a.a(f)&&e.add(f)})):b.getElementsByClassName&&d&&"class"==c?(b=b.getElementsByClassName(d),n(b,function(f){f.className==d&&a.a(f)&&e.add(f)})):a instanceof G?gb(a,b,c,d,e):b.getElementsByTagName&&(b=b.getElementsByTagName(a.f()),n(b,function(f){C(f,c,d)&&e.add(f)}));return e}
function hb(a,b,c,d,e){var f;if((a instanceof F||8==a.b||c&&null===a.b)&&(f=b.childNodes)){var g=eb(a);if("*"!=g&&(f=ka(f,function(h){return h.tagName&&h.tagName.toLowerCase()==g}),!f))return e;c&&(f=ka(f,function(h){return C(h,c,d)}));n(f,function(h){"*"==g&&("!"==h.tagName||"*"==g&&1!=h.nodeType)||e.add(h)});return e}return ib(a,b,c,d,e)}function ib(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)C(b,c,d)&&a.a(b)&&e.add(b);return e}
function gb(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)C(b,c,d)&&a.a(b)&&e.add(b),gb(a,b,c,d,e)}function eb(a){if(a instanceof G){if(8==a.b)return"!";if(null===a.b)return"*"}return a.f()};function E(){this.b=this.a=null;this.l=0}function jb(a){this.f=a;this.a=this.b=null}function kb(a,b){if(!a.a)return b;if(!b.a)return a;var c=a.a;b=b.a;for(var d=null,e,f=0;c&&b;){e=c.f;var g=b.f;e==g||e instanceof Na&&g instanceof Na&&e.a==g.a?(e=c,c=c.a,b=b.a):0<Xa(c.f,b.f)?(e=b,b=b.a):(e=c,c=c.a);(e.b=d)?d.a=e:a.a=e;d=e;f++}for(e=c||b;e;)e.b=d,d=d.a=e,f++,e=e.a;a.b=d;a.l=f;return a}function lb(a,b){b=new jb(b);b.a=a.a;a.b?a.a.b=b:a.a=a.b=b;a.a=b;a.l++}
E.prototype.add=function(a){a=new jb(a);a.b=this.b;this.a?this.b.a=a:this.a=this.b=a;this.b=a;this.l++};function mb(a){return(a=a.a)?a.f:null}function nb(a){return(a=mb(a))?B(a):""}function H(a,b){return new ob(a,!!b)}function ob(a,b){this.f=a;this.b=(this.s=b)?a.b:a.a;this.a=null}function I(a){var b=a.b;if(null==b)return null;var c=a.a=b;a.b=a.s?b.b:b.a;return c.f};function J(a){this.i=a;this.b=this.g=!1;this.f=null}function K(a){return"\n "+a.toString().split("\n").join("\n ")}function pb(a,b){a.g=b}function qb(a,b){a.b=b}function N(a,b){a=a.a(b);return a instanceof E?+nb(a):+a}function O(a,b){a=a.a(b);return a instanceof E?nb(a):""+a}function rb(a,b){a=a.a(b);return a instanceof E?!!a.l:!!a};function sb(a,b,c){J.call(this,a.i);this.c=a;this.h=b;this.o=c;this.g=b.g||c.g;this.b=b.b||c.b;this.c==tb&&(c.b||c.g||4==c.i||0==c.i||!b.f?b.b||b.g||4==b.i||0==b.i||!c.f||(this.f={name:c.f.name,u:b}):this.f={name:b.f.name,u:c})}l(sb,J);
function ub(a,b,c,d,e){b=b.a(d);c=c.a(d);var f;if(b instanceof E&&c instanceof E){b=H(b);for(d=I(b);d;d=I(b))for(e=H(c),f=I(e);f;f=I(e))if(a(B(d),B(f)))return!0;return!1}if(b instanceof E||c instanceof E){b instanceof E?(e=b,d=c):(e=c,d=b);f=H(e);for(var g=typeof d,h=I(f);h;h=I(f)){switch(g){case "number":h=+B(h);break;case "boolean":h=!!B(h);break;case "string":h=B(h);break;default:throw Error("Illegal primitive type for comparison.");}if(e==b&&a(h,d)||e==c&&a(d,h))return!0}return!1}return e?"boolean"==
typeof b||"boolean"==typeof c?a(!!b,!!c):"number"==typeof b||"number"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}sb.prototype.a=function(a){return this.c.m(this.h,this.o,a)};sb.prototype.toString=function(){var a="Binary Expression: "+this.c;a+=K(this.h);return a+=K(this.o)};function vb(a,b,c,d){this.I=a;this.D=b;this.i=c;this.m=d}vb.prototype.toString=function(){return this.I};var wb={};
function P(a,b,c,d){if(wb.hasOwnProperty(a))throw Error("Binary operator already created: "+a);a=new vb(a,b,c,d);return wb[a.toString()]=a}P("div",6,1,function(a,b,c){return N(a,c)/N(b,c)});P("mod",6,1,function(a,b,c){return N(a,c)%N(b,c)});P("*",6,1,function(a,b,c){return N(a,c)*N(b,c)});P("+",5,1,function(a,b,c){return N(a,c)+N(b,c)});P("-",5,1,function(a,b,c){return N(a,c)-N(b,c)});P("<",4,2,function(a,b,c){return ub(function(d,e){return d<e},a,b,c)});
P(">",4,2,function(a,b,c){return ub(function(d,e){return d>e},a,b,c)});P("<=",4,2,function(a,b,c){return ub(function(d,e){return d<=e},a,b,c)});P(">=",4,2,function(a,b,c){return ub(function(d,e){return d>=e},a,b,c)});var tb=P("=",3,2,function(a,b,c){return ub(function(d,e){return d==e},a,b,c,!0)});P("!=",3,2,function(a,b,c){return ub(function(d,e){return d!=e},a,b,c,!0)});P("and",2,2,function(a,b,c){return rb(a,c)&&rb(b,c)});P("or",1,2,function(a,b,c){return rb(a,c)||rb(b,c)});function xb(a,b){if(b.a.length&&4!=a.i)throw Error("Primary expression must evaluate to nodeset if filter has predicate(s).");J.call(this,a.i);this.c=a;this.h=b;this.g=a.g;this.b=a.b}l(xb,J);xb.prototype.a=function(a){a=this.c.a(a);return yb(this.h,a)};xb.prototype.toString=function(){var a="Filter:"+K(this.c);return a+=K(this.h)};function zb(a,b){if(b.length<a.C)throw Error("Function "+a.j+" expects at least"+a.C+" arguments, "+b.length+" given");if(null!==a.B&&b.length>a.B)throw Error("Function "+a.j+" expects at most "+a.B+" arguments, "+b.length+" given");a.H&&n(b,function(c,d){if(4!=c.i)throw Error("Argument "+d+" to function "+a.j+" is not of type Nodeset: "+c);});J.call(this,a.i);this.v=a;this.c=b;pb(this,a.g||ma(b,function(c){return c.g}));qb(this,a.G&&!b.length||a.F&&!!b.length||ma(b,function(c){return c.b}))}
l(zb,J);zb.prototype.a=function(a){return this.v.m.apply(null,pa(a,this.c))};zb.prototype.toString=function(){var a="Function: "+this.v;if(this.c.length){var b=la(this.c,function(c,d){return c+K(d)},"Arguments:");a+=K(b)}return a};function Ab(a,b,c,d,e,f,g,h){this.j=a;this.i=b;this.g=c;this.G=d;this.F=!1;this.m=e;this.C=f;this.B=void 0!==g?g:f;this.H=!!h}Ab.prototype.toString=function(){return this.j};var Bb={};
function Q(a,b,c,d,e,f,g,h){if(Bb.hasOwnProperty(a))throw Error("Function already created: "+a+".");Bb[a]=new Ab(a,b,c,d,e,f,g,h)}Q("boolean",2,!1,!1,function(a,b){return rb(b,a)},1);Q("ceiling",1,!1,!1,function(a,b){return Math.ceil(N(b,a))},1);Q("concat",3,!1,!1,function(a,b){return la(qa(arguments,1),function(c,d){return c+O(d,a)},"")},2,null);Q("contains",2,!1,!1,function(a,b,c){b=O(b,a);a=O(c,a);return-1!=b.indexOf(a)},2);Q("count",1,!1,!1,function(a,b){return b.a(a).l},1,1,!0);
Q("false",2,!1,!1,function(){return!1},0);Q("floor",1,!1,!1,function(a,b){return Math.floor(N(b,a))},1);Q("id",4,!1,!1,function(a,b){function c(h){if(x){var m=e.all[h];if(m){if(m.nodeType&&h==m.id)return m;if(m.length)return oa(m,function(w){return h==w.id})}return null}return e.getElementById(h)}var d=a.a,e=9==d.nodeType?d:d.ownerDocument;a=O(b,a).split(/\s+/);var f=[];n(a,function(h){h=c(h);!h||0<=ja(f,h)||f.push(h)});f.sort(Xa);var g=new E;n(f,function(h){g.add(h)});return g},1);
Q("lang",2,!1,!1,function(){return!1},1);Q("last",1,!0,!1,function(a){if(1!=arguments.length)throw Error("Function last expects ()");return a.f},0);Q("local-name",3,!1,!0,function(a,b){return(a=b?mb(b.a(a)):a.a)?a.localName||a.nodeName.toLowerCase():""},0,1,!0);Q("name",3,!1,!0,function(a,b){return(a=b?mb(b.a(a)):a.a)?a.nodeName.toLowerCase():""},0,1,!0);Q("namespace-uri",3,!0,!1,function(){return""},0,1,!0);
Q("normalize-space",3,!1,!0,function(a,b){return(b?O(b,a):B(a.a)).replace(/[\s\xa0]+/g," ").replace(/^\s+|\s+$/g,"")},0,1);Q("not",2,!1,!1,function(a,b){return!rb(b,a)},1);Q("number",1,!1,!0,function(a,b){return b?N(b,a):+B(a.a)},0,1);Q("position",1,!0,!1,function(a){return a.b},0);Q("round",1,!1,!1,function(a,b){return Math.round(N(b,a))},1);Q("starts-with",2,!1,!1,function(a,b,c){b=O(b,a);a=O(c,a);return 0==b.lastIndexOf(a,0)},2);Q("string",3,!1,!0,function(a,b){return b?O(b,a):B(a.a)},0,1);
Q("string-length",1,!1,!0,function(a,b){return(b?O(b,a):B(a.a)).length},0,1);Q("substring",3,!1,!1,function(a,b,c,d){c=N(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)return"";d=d?N(d,a):Infinity;if(isNaN(d)||-Infinity===d)return"";c=Math.round(c)-1;var e=Math.max(c,0);a=O(b,a);return Infinity==d?a.substring(e):a.substring(e,c+Math.round(d))},2,3);Q("substring-after",3,!1,!1,function(a,b,c){b=O(b,a);a=O(c,a);c=b.indexOf(a);return-1==c?"":b.substring(c+a.length)},2);
Q("substring-before",3,!1,!1,function(a,b,c){b=O(b,a);a=O(c,a);a=b.indexOf(a);return-1==a?"":b.substring(0,a)},2);Q("sum",1,!1,!1,function(a,b){a=H(b.a(a));b=0;for(var c=I(a);c;c=I(a))b+=+B(c);return b},1,1,!0);Q("translate",3,!1,!1,function(a,b,c,d){b=O(b,a);c=O(c,a);var e=O(d,a);a={};for(d=0;d<c.length;d++){var f=c.charAt(d);f in a||(a[f]=e.charAt(d))}c="";for(d=0;d<b.length;d++)f=b.charAt(d),c+=f in a?a[f]:f;return c},3);Q("true",2,!1,!1,function(){return!0},0);function G(a,b){this.h=a;this.c=void 0!==b?b:null;this.b=null;switch(a){case "comment":this.b=8;break;case "text":this.b=3;break;case "processing-instruction":this.b=7;break;case "node":break;default:throw Error("Unexpected argument");}}function Cb(a){return"comment"==a||"text"==a||"processing-instruction"==a||"node"==a}G.prototype.a=function(a){return null===this.b||this.b==a.nodeType};G.prototype.f=function(){return this.h};
G.prototype.toString=function(){var a="Kind Test: "+this.h;null===this.c||(a+=K(this.c));return a};function Db(a){J.call(this,3);this.c=a.substring(1,a.length-1)}l(Db,J);Db.prototype.a=function(){return this.c};Db.prototype.toString=function(){return"Literal: "+this.c};function F(a,b){this.j=a.toLowerCase();a="*"==this.j?"*":"http://www.w3.org/1999/xhtml";this.c=b?b.toLowerCase():a}F.prototype.a=function(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=void 0!==a.localName?a.localName:a.nodeName;return"*"!=this.j&&this.j!=b.toLowerCase()?!1:"*"==this.c?!0:this.c==(a.namespaceURI?a.namespaceURI.toLowerCase():"http://www.w3.org/1999/xhtml")};F.prototype.f=function(){return this.j};
F.prototype.toString=function(){return"Name Test: "+("http://www.w3.org/1999/xhtml"==this.c?"":this.c+":")+this.j};function Eb(a){J.call(this,1);this.c=a}l(Eb,J);Eb.prototype.a=function(){return this.c};Eb.prototype.toString=function(){return"Number: "+this.c};function Fb(a,b){J.call(this,a.i);this.h=a;this.c=b;this.g=a.g;this.b=a.b;1==this.c.length&&(a=this.c[0],a.A||a.c!=Gb||(a=a.o,"*"!=a.f()&&(this.f={name:a.f(),u:null})))}l(Fb,J);function Hb(){J.call(this,4)}l(Hb,J);Hb.prototype.a=function(a){var b=new E;a=a.a;9==a.nodeType?b.add(a):b.add(a.ownerDocument);return b};Hb.prototype.toString=function(){return"Root Helper Expression"};function Ib(){J.call(this,4)}l(Ib,J);Ib.prototype.a=function(a){var b=new E;b.add(a.a);return b};Ib.prototype.toString=function(){return"Context Helper Expression"};
function Jb(a){return"/"==a||"//"==a}Fb.prototype.a=function(a){var b=this.h.a(a);if(!(b instanceof E))throw Error("Filter expression must evaluate to nodeset.");a=this.c;for(var c=0,d=a.length;c<d&&b.l;c++){var e=a[c],f=H(b,e.c.s);if(e.g||e.c!=Kb)if(e.g||e.c!=Lb){var g=I(f);for(b=e.a(new ia(g));null!=(g=I(f));)g=e.a(new ia(g)),b=kb(b,g)}else g=I(f),b=e.a(new ia(g));else{for(g=I(f);(b=I(f))&&(!g.contains||g.contains(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.a(new ia(g))}}return b};
Fb.prototype.toString=function(){var a="Path Expression:"+K(this.h);if(this.c.length){var b=la(this.c,function(c,d){return c+K(d)},"Steps:");a+=K(b)}return a};function Mb(a,b){this.a=a;this.s=!!b}
function yb(a,b,c){for(c=c||0;c<a.a.length;c++)for(var d=a.a[c],e=H(b),f=b.l,g,h=0;g=I(e);h++){var m=a.s?f-h:h+1;g=d.a(new ia(g,m,f));if("number"==typeof g)m=m==g;else if("string"==typeof g||"boolean"==typeof g)m=!!g;else if(g instanceof E)m=0<g.l;else throw Error("Predicate.evaluate returned an unexpected type.");if(!m){m=e;g=m.f;var w=m.a;if(!w)throw Error("Next must be called at least once before remove.");var r=w.b;w=w.a;r?r.a=w:g.a=w;w?w.b=r:g.b=r;g.l--;m.a=null}}return b}
Mb.prototype.toString=function(){return la(this.a,function(a,b){return a+K(b)},"Predicates:")};function R(a,b,c,d){J.call(this,4);this.c=a;this.o=b;this.h=c||new Mb([]);this.A=!!d;b=this.h;b=0<b.a.length?b.a[0].f:null;a.J&&b&&(a=b.name,a=x?a.toLowerCase():a,this.f={name:a,u:b.u});a:{a=this.h;for(b=0;b<a.a.length;b++)if(c=a.a[b],c.g||1==c.i||0==c.i){a=!0;break a}a=!1}this.g=a}l(R,J);
R.prototype.a=function(a){var b=a.a,c=this.f,d=null,e=null,f=0;c&&(d=c.name,e=c.u?O(c.u,a):null,f=1);if(this.A)if(this.g||this.c!=Nb)if(b=H((new R(Ob,new G("node"))).a(a)),c=I(b))for(a=this.m(c,d,e,f);null!=(c=I(b));)a=kb(a,this.m(c,d,e,f));else a=new E;else a=bb(this.o,b,d,e),a=yb(this.h,a,f);else a=this.m(a.a,d,e,f);return a};R.prototype.m=function(a,b,c,d){a=this.c.v(this.o,a,b,c);return a=yb(this.h,a,d)};
R.prototype.toString=function(){var a="Step:"+K("Operator: "+(this.A?"//":"/"));this.c.j&&(a+=K("Axis: "+this.c));a+=K(this.o);if(this.h.a.length){var b=la(this.h.a,function(c,d){return c+K(d)},"Predicates:");a+=K(b)}return a};function Pb(a,b,c,d){this.j=a;this.v=b;this.s=c;this.J=d}Pb.prototype.toString=function(){return this.j};var Qb={};function S(a,b,c,d){if(Qb.hasOwnProperty(a))throw Error("Axis already created: "+a);b=new Pb(a,b,c,!!d);return Qb[a]=b}
S("ancestor",function(a,b){for(var c=new E;b=b.parentNode;)a.a(b)&&lb(c,b);return c},!0);S("ancestor-or-self",function(a,b){var c=new E;do a.a(b)&&lb(c,b);while(b=b.parentNode);return c},!0);
var Gb=S("attribute",function(a,b){var c=new E,d=a.f();if("style"==d&&x&&b.style)return c.add(new Na(b.style,b,"style",b.style.cssText)),c;var e=b.attributes;if(e)if(a instanceof G&&null===a.b||"*"==d)for(a=0;d=e[a];a++)x?d.nodeValue&&c.add(Oa(b,d)):c.add(d);else(d=e.getNamedItem(d))&&(x?d.nodeValue&&c.add(Oa(b,d)):c.add(d));return c},!1),Nb=S("child",function(a,b,c,d,e){return(x?hb:ib).call(null,a,b,aa(c)?c:null,aa(d)?d:null,e||new E)},!1,!0);S("descendant",bb,!1,!0);
var Ob=S("descendant-or-self",function(a,b,c,d){var e=new E;C(b,c,d)&&a.a(b)&&e.add(b);return bb(a,b,c,d,e)},!1,!0),Kb=S("following",function(a,b,c,d){var e=new E;do for(var f=b;f=f.nextSibling;)C(f,c,d)&&a.a(f)&&e.add(f),e=bb(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);S("following-sibling",function(a,b){for(var c=new E;b=b.nextSibling;)a.a(b)&&c.add(b);return c},!1);S("namespace",function(){return new E},!1);
var Rb=S("parent",function(a,b){var c=new E;if(9==b.nodeType)return c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.a(b)&&c.add(b);return c},!1),Lb=S("preceding",function(a,b,c,d){var e=new E,f=[];do f.unshift(b);while(b=b.parentNode);for(var g=1,h=f.length;g<h;g++){var m=[];for(b=f[g];b=b.previousSibling;)m.unshift(b);for(var w=0,r=m.length;w<r;w++)b=m[w],C(b,c,d)&&a.a(b)&&e.add(b),e=bb(a,b,c,d,e)}return e},!0,!0);
S("preceding-sibling",function(a,b){for(var c=new E;b=b.previousSibling;)a.a(b)&&lb(c,b);return c},!0);var Sb=S("self",function(a,b){var c=new E;a.a(b)&&c.add(b);return c},!1);function Tb(a){J.call(this,1);this.c=a;this.g=a.g;this.b=a.b}l(Tb,J);Tb.prototype.a=function(a){return-N(this.c,a)};Tb.prototype.toString=function(){return"Unary Expression: -"+K(this.c)};function Ub(a){J.call(this,4);this.c=a;pb(this,ma(this.c,function(b){return b.g}));qb(this,ma(this.c,function(b){return b.b}))}l(Ub,J);Ub.prototype.a=function(a){var b=new E;n(this.c,function(c){c=c.a(a);if(!(c instanceof E))throw Error("Path expression must evaluate to NodeSet.");b=kb(b,c)});return b};Ub.prototype.toString=function(){return la(this.c,function(a,b){return a+K(b)},"Union Expression:")};function Vb(a,b){this.a=a;this.b=b}function Yb(a){for(var b,c=[];;){T(a,"Missing right hand side of binary expression.");b=Zb(a);var d=z(a.a);if(!d)break;var e=(d=wb[d]||null)&&d.D;if(!e){a.a.a--;break}for(;c.length&&e<=c[c.length-1].D;)b=new sb(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new sb(c.pop(),c.pop(),b);return b}function T(a,b){if(Ta(a.a))throw Error(b);}function $b(a,b){a=z(a.a);if(a!=b)throw Error("Bad token, expected: "+b+" got: "+a);}
function ac(a){a=z(a.a);if(")"!=a)throw Error("Bad token: "+a);}function bc(a){a=z(a.a);if(2>a.length)throw Error("Unclosed literal string");return new Db(a)}
function cc(a){var b=[];if(Jb(y(a.a))){var c=z(a.a);var d=y(a.a);if("/"==c&&(Ta(a.a)||"."!=d&&".."!=d&&"@"!=d&&"*"!=d&&!/(?![0-9])[\w]/.test(d)))return new Hb;d=new Hb;T(a,"Missing next location step.");c=dc(a,c);b.push(c)}else{a:{c=y(a.a);d=c.charAt(0);switch(d){case "$":throw Error("Variable reference not allowed in HTML XPath");case "(":z(a.a);c=Yb(a);T(a,'unclosed "("');$b(a,")");break;case '"':case "'":c=bc(a);break;default:if(isNaN(+c))if(!Cb(c)&&/(?![0-9])[\w]/.test(d)&&"("==y(a.a,1)){c=z(a.a);
c=Bb[c]||null;z(a.a);for(d=[];")"!=y(a.a);){T(a,"Missing function argument list.");d.push(Yb(a));if(","!=y(a.a))break;z(a.a)}T(a,"Unclosed function argument list.");ac(a);c=new zb(c,d)}else{c=null;break a}else c=new Eb(+z(a.a))}"["==y(a.a)&&(d=new Mb(ec(a)),c=new xb(c,d))}if(c)if(Jb(y(a.a)))d=c;else return c;else c=dc(a,"/"),d=new Ib,b.push(c)}for(;Jb(y(a.a));)c=z(a.a),T(a,"Missing next location step."),c=dc(a,c),b.push(c);return new Fb(d,b)}
function dc(a,b){if("/"!=b&&"//"!=b)throw Error('Step op should be "/" or "//"');if("."==y(a.a)){var c=new R(Sb,new G("node"));z(a.a);return c}if(".."==y(a.a))return c=new R(Rb,new G("node")),z(a.a),c;if("@"==y(a.a)){var d=Gb;z(a.a);T(a,"Missing attribute name")}else if("::"==y(a.a,1)){if(!/(?![0-9])[\w]/.test(y(a.a).charAt(0)))throw Error("Bad token: "+z(a.a));var e=z(a.a);d=Qb[e]||null;if(!d)throw Error("No axis with name: "+e);z(a.a);T(a,"Missing node name")}else d=Nb;e=y(a.a);if(/(?![0-9])[\w\*]/.test(e.charAt(0)))if("("==
y(a.a,1)){if(!Cb(e))throw Error("Invalid node type: "+e);e=z(a.a);if(!Cb(e))throw Error("Invalid type name: "+e);$b(a,"(");T(a,"Bad nodetype");var f=y(a.a).charAt(0),g=null;if('"'==f||"'"==f)g=bc(a);T(a,"Bad nodetype");ac(a);e=new G(e,g)}else if(e=z(a.a),f=e.indexOf(":"),-1==f)e=new F(e);else{g=e.substring(0,f);if("*"==g)var h="*";else if(h=a.b(g),!h)throw Error("Namespace prefix not declared: "+g);e=e.substr(f+1);e=new F(e,h)}else throw Error("Bad token: "+z(a.a));a=new Mb(ec(a),d.s);return c||new R(d,
e,a,"//"==b)}function ec(a){for(var b=[];"["==y(a.a);){z(a.a);T(a,"Missing predicate expression.");var c=Yb(a);b.push(c);T(a,"Unclosed predicate expression.");$b(a,"]")}return b}function Zb(a){if("-"==y(a.a))return z(a.a),new Tb(Zb(a));var b=cc(a);if("|"!=y(a.a))a=b;else{for(b=[b];"|"==z(a.a);)T(a,"Missing next union location path."),b.push(cc(a));a.a.a--;a=new Ub(b)}return a};function fc(a){switch(a.nodeType){case 1:return ha(gc,a);case 9:return fc(a.documentElement);case 11:case 10:case 6:case 12:return hc;default:return a.parentNode?fc(a.parentNode):hc}}function hc(){return null}function gc(a,b){if(a.prefix==b)return a.namespaceURI||"http://www.w3.org/1999/xhtml";var c=a.getAttributeNode("xmlns:"+b);return c&&c.specified?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?gc(a.parentNode,b):null};function ic(a,b){if(!a.length)throw Error("Empty XPath expression.");a=Qa(a);if(Ta(a))throw Error("Invalid XPath expression.");b?"function"==ca(b)||(b=fa(b.lookupNamespaceURI,b)):b=function(){return null};var c=Yb(new Vb(a,b));if(!Ta(a))throw Error("Bad token: "+z(a));this.evaluate=function(d,e){d=c.a(new ia(d));return new U(d,e)}}
function U(a,b){if(0==b)if(a instanceof E)b=4;else if("string"==typeof a)b=2;else if("number"==typeof a)b=1;else if("boolean"==typeof a)b=3;else throw Error("Unexpected evaluation result.");if(2!=b&&1!=b&&3!=b&&!(a instanceof E))throw Error("value could not be converted to the specified type");this.resultType=b;switch(b){case 2:this.stringValue=a instanceof E?nb(a):""+a;break;case 1:this.numberValue=a instanceof E?+nb(a):+a;break;case 3:this.booleanValue=a instanceof E?0<a.l:!!a;break;case 4:case 5:case 6:case 7:var c=
H(a);var d=[];for(var e=I(c);e;e=I(c))d.push(e instanceof Na?e.a:e);this.snapshotLength=a.l;this.invalidIteratorState=!1;break;case 8:case 9:a=mb(a);this.singleNodeValue=a instanceof Na?a.a:a;break;default:throw Error("Unknown XPathResult type.");}var f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error("iterateNext called with wrong result type");return f>=d.length?null:d[f++]};this.snapshotItem=function(g){if(6!=b&&7!=b)throw Error("snapshotItem called with wrong result type");return g>=d.length||
0>g?null:d[g]}}U.ANY_TYPE=0;U.NUMBER_TYPE=1;U.STRING_TYPE=2;U.BOOLEAN_TYPE=3;U.UNORDERED_NODE_ITERATOR_TYPE=4;U.ORDERED_NODE_ITERATOR_TYPE=5;U.UNORDERED_NODE_SNAPSHOT_TYPE=6;U.ORDERED_NODE_SNAPSHOT_TYPE=7;U.ANY_UNORDERED_NODE_TYPE=8;U.FIRST_ORDERED_NODE_TYPE=9;function jc(a){this.lookupNamespaceURI=fc(a)}
function kc(a,b){a=a||k;var c=a.Document&&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathResult=U,c.evaluate=function(d,e,f,g){return(new ic(d,f)).evaluate(e,g)},c.createExpression=function(d,e){return new ic(d,e)},c.createNSResolver=function(d){return new jc(d)}}ba("wgxpath.install",kc);ba("wgxpath.install",kc);var lc={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",
module.exports = function(){return (function(){var g=this||self;
function aa(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if("function"==
b&&"undefined"==typeof a.call)return"object";return b}function ca(a,b){function c(){}c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a};var da=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},ea=Array.prototype.some?function(a,b){return Array.prototype.some.call(a,b,void 0)}:function(a,b){for(var c=a.length,e="string"===typeof a?a.split(""):a,d=0;d<c;d++)if(d in e&&b.call(void 0,e[d],d,a))return!0;return!1},fa=Array.prototype.every?function(a,
b){return Array.prototype.every.call(a,b,void 0)}:function(a,b){for(var c=a.length,e="string"===typeof a?a.split(""):a,d=0;d<c;d++)if(d in e&&!b.call(void 0,e[d],d,a))return!1;return!0};var ha={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",
darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",

@@ -84,20 +10,21 @@ ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",

moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",
seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};var mc="backgroundColor borderTopColor borderRightColor borderBottomColor borderLeftColor color outlineColor".split(" "),nc=/#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/,oc=/^#(?:[0-9a-f]{3}){1,2}$/i,pc=/^(?:rgba)?\((\d{1,3}),\s?(\d{1,3}),\s?(\d{1,3}),\s?(0|1|0\.\d*)\)$/i,qc=/^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i;function rc(a,b){this.code=a;this.a=V[a]||sc;this.message=b||"";a=this.a.replace(/((?:^|\s+)[a-z])/g,function(c){return c.toUpperCase().replace(/^[\s\xa0]+/g,"")});b=a.length-5;if(0>b||a.indexOf("Error",b)!=b)a+="Error";this.name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||""}l(rc,Error);var sc="unknown error",V={15:"element not selectable",11:"element not visible"};V[31]=sc;V[30]=sc;V[24]="invalid cookie domain";V[29]="invalid element coordinates";V[12]="invalid element state";
V[32]="invalid selector";V[51]="invalid selector";V[52]="invalid selector";V[17]="javascript error";V[405]="unsupported operation";V[34]="move target out of bounds";V[27]="no such alert";V[7]="no such element";V[8]="no such frame";V[23]="no such window";V[28]="script timeout";V[33]="session not created";V[10]="stale element reference";V[21]="timeout";V[25]="unable to set cookie";V[26]="unexpected alert open";V[13]=sc;V[9]="unknown command";var tc=va(),uc=ya()||u("iPod"),vc=u("iPad"),wc=u("Android")&&!(wa()||va()||u("Opera")||u("Silk")),xc=wa(),yc=u("Safari")&&!(wa()||u("Coast")||u("Opera")||u("Edge")||u("Edg/")||u("OPR")||va()||u("Silk")||u("Android"))&&!(ya()||u("iPad")||u("iPod"));function zc(a){return(a=a.exec(t))?a[1]:""}(function(){if(tc)return zc(/Firefox\/([0-9.]+)/);if(v||Ca||Ba)return Ga;if(xc)return ya()||u("iPad")||u("iPod")?zc(/CriOS\/([0-9.]+)/):zc(/Chrome\/([0-9.]+)/);if(yc&&!(ya()||u("iPad")||u("iPod")))return zc(/Version\/([0-9.]+)/);if(uc||vc){var a=/Version\/(\S+).*Mobile\/(\S+)/.exec(t);if(a)return a[1]+"."+a[2]}else if(wc)return(a=zc(/Android\s+([0-9.]+)/))?a:zc(/Version\/([0-9.]+)/);return""})();var Ac=v&&!(9<=Number(La));function W(a,b){b&&"string"!==typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)};var Bc=function(){var a={K:"http://www.w3.org/2000/svg"};return function(b){return a[b]||null}}();
function Cc(a,b){var c=A(a);if(!c.documentElement)return null;(v||wc)&&kc(c?c.parentWindow||c.defaultView:window);try{var d=c.createNSResolver?c.createNSResolver(c.documentElement):Bc;if(v&&!Ka(7))return c.evaluate.call(c,b,a,d,9,null);if(!v||9<=Number(La)){for(var e={},f=c.getElementsByTagName("*"),g=0;g<f.length;++g){var h=f[g],m=h.namespaceURI;if(m&&!e[m]){var w=h.lookupPrefix(m);if(!w){var r=m.match(".*/(\\w+)/?$");w=r?r[1]:"xhtml"}e[m]=w}}var D={},L;for(L in e)D[e[L]]=L;d=function(M){return D[M]||
null}}try{return c.evaluate(b,a,d,9,null)}catch(M){if("TypeError"===M.name)return d=c.createNSResolver?c.createNSResolver(c.documentElement):Bc,c.evaluate(b,a,d,9,null);throw M;}}catch(M){if(!Da||"NS_ERROR_ILLEGAL_VALUE"!=M.name)throw new rc(32,"Unable to locate an element with the xpath expression "+b+" because of the following error:\n"+M);}}
function Dc(a,b){var c=function(){var d=Cc(b,a);return d?d.singleNodeValue||null:b.selectSingleNode?(d=A(b),d.setProperty&&d.setProperty("SelectionLanguage","XPath"),b.selectSingleNode(a)):null}();if(null!==c&&(!c||1!=c.nodeType))throw new rc(32,'The result of the xpath expression "'+a+'" is: '+c+". It should be an element.");return c};function Ec(a,b,c,d){this.c=a;this.a=b;this.b=c;this.f=d}Ec.prototype.ceil=function(){this.c=Math.ceil(this.c);this.a=Math.ceil(this.a);this.b=Math.ceil(this.b);this.f=Math.ceil(this.f);return this};Ec.prototype.floor=function(){this.c=Math.floor(this.c);this.a=Math.floor(this.a);this.b=Math.floor(this.b);this.f=Math.floor(this.f);return this};Ec.prototype.round=function(){this.c=Math.round(this.c);this.a=Math.round(this.a);this.b=Math.round(this.b);this.f=Math.round(this.f);return this};function X(a,b,c,d){this.a=a;this.b=b;this.width=c;this.height=d}X.prototype.ceil=function(){this.a=Math.ceil(this.a);this.b=Math.ceil(this.b);this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};X.prototype.floor=function(){this.a=Math.floor(this.a);this.b=Math.floor(this.b);this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};
X.prototype.round=function(){this.a=Math.round(this.a);this.b=Math.round(this.b);this.width=Math.round(this.width);this.height=Math.round(this.height);return this};var Fc="function"===typeof ShadowRoot;function Gc(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return W(a)?a:null}
function Y(a,b){b=xa(b);if("float"==b||"cssFloat"==b||"styleFloat"==b)b=Ac?"styleFloat":"cssFloat";a:{var c=b;var d=A(a);if(d.defaultView&&d.defaultView.getComputedStyle&&(d=d.defaultView.getComputedStyle(a,null))){c=d[c]||d.getPropertyValue(c)||"";break a}c=""}a=c||Hc(a,b);if(null===a)a=null;else if(0<=ja(mc,b)){b:{var e=a.match(pc);if(e&&(b=Number(e[1]),c=Number(e[2]),d=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b,c,d,e];break b}b=null}if(!b)b:{if(d=a.match(qc))if(b=
Number(d[1]),c=Number(d[2]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c=lc[b.toLowerCase()];if(!c&&(c="#"==b.charAt(0)?b:"#"+b,4==c.length&&(c=c.replace(nc,"#$1$1$2$2$3$3")),!oc.test(c))){b=null;break b}b=[parseInt(c.substr(1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(5,2),16),1]}a=b?"rgba("+b.join(", ")+")":a}return a}
function Hc(a,b){var c=a.currentStyle||a.style,d=c[b];void 0===d&&"function"==ca(c.getPropertyValue)&&(d=c.getPropertyValue(b));return"inherit"!=d?void 0!==d?d:null:(a=Gc(a))?Hc(a,b):null}
function Ic(a,b,c){function d(g){var h=Jc(g);return 0<h.height&&0<h.width?!0:W(g,"PATH")&&(0<h.height||0<h.width)?(g=Y(g,"stroke-width"),!!g&&0<parseInt(g,10)):"hidden"!=Y(g,"overflow")&&ma(g.childNodes,function(m){return 3==m.nodeType||W(m)&&d(m)})}function e(g){return Kc(g)==Z&&na(g.childNodes,function(h){return!W(h)||e(h)||!d(h)})}if(!W(a))throw Error("Argument to isShown must be of type Element");if(W(a,"BODY"))return!0;if(W(a,"OPTION")||W(a,"OPTGROUP"))return a=$a(a,function(g){return W(g,"SELECT")}),
!!a&&Ic(a,!0,c);var f=Lc(a);if(f)return!!f.image&&0<f.rect.width&&0<f.rect.height&&Ic(f.image,b,c);if(W(a,"INPUT")&&"hidden"==a.type.toLowerCase()||W(a,"NOSCRIPT"))return!1;f=Y(a,"visibility");return"collapse"!=f&&"hidden"!=f&&c(a)&&(b||0!=Mc(a))&&d(a)?!e(a):!1}var Z="hidden";
function Kc(a){function b(p){function q(fb){if(fb==g)return!0;var Wb=Y(fb,"display");return 0==Wb.lastIndexOf("inline",0)||"contents"==Wb||"absolute"==Xb&&"static"==Y(fb,"position")?!1:!0}var Xb=Y(p,"position");if("fixed"==Xb)return w=!0,p==g?null:g;for(p=Gc(p);p&&!q(p);)p=Gc(p);return p}function c(p){var q=p;if("visible"==m)if(p==g&&h)q=h;else if(p==h)return{x:"visible",y:"visible"};q={x:Y(q,"overflow-x"),y:Y(q,"overflow-y")};p==g&&(q.x="visible"==q.x?"auto":q.x,q.y="visible"==q.y?"auto":q.y);return q}
function d(p){if(p==g){var q=(new ab(f)).a;p=q.scrollingElement?q.scrollingElement:Ea||"CSS1Compat"!=q.compatMode?q.body||q.documentElement:q.documentElement;q=q.parentWindow||q.defaultView;p=v&&Ka("10")&&q.pageYOffset!=p.scrollTop?new Ua(p.scrollLeft,p.scrollTop):new Ua(q.pageXOffset||p.scrollLeft,q.pageYOffset||p.scrollTop)}else p=new Ua(p.scrollLeft,p.scrollTop);return p}var e=Nc(a),f=A(a),g=f.documentElement,h=f.body,m=Y(g,"overflow"),w;for(a=b(a);a;a=b(a)){var r=c(a);if("visible"!=r.x||"visible"!=
r.y){var D=Jc(a);if(0==D.width||0==D.height)return Z;var L=e.a<D.a,M=e.b<D.b;if(L&&"hidden"==r.x||M&&"hidden"==r.y)return Z;if(L&&"visible"!=r.x||M&&"visible"!=r.y){L=d(a);M=e.b<D.b-L.y;if(e.a<D.a-L.x&&"visible"!=r.x||M&&"visible"!=r.x)return Z;e=Kc(a);return e==Z?Z:"scroll"}L=e.f>=D.a+D.width;D=e.c>=D.b+D.height;if(L&&"hidden"==r.x||D&&"hidden"==r.y)return Z;if(L&&"visible"!=r.x||D&&"visible"!=r.y){if(w&&(r=d(a),e.f>=g.scrollWidth-r.x||e.a>=g.scrollHeight-r.y))return Z;e=Kc(a);return e==Z?Z:"scroll"}}}return"none"}
function Jc(a){var b=Lc(a);if(b)return b.rect;if(W(a,"HTML"))return a=A(a),a=((a?a.parentWindow||a.defaultView:window)||window).document,a="CSS1Compat"==a.compatMode?a.documentElement:a.body,a=new Va(a.clientWidth,a.clientHeight),new X(0,0,a.width,a.height);try{var c=a.getBoundingClientRect()}catch(d){return new X(0,0,0,0)}b=new X(c.left,c.top,c.right-c.left,c.bottom-c.top);v&&a.ownerDocument.body&&(a=A(a),b.a-=a.documentElement.clientLeft+a.body.clientLeft,b.b-=a.documentElement.clientTop+a.body.clientTop);
return b}function Lc(a){var b=W(a,"MAP");if(!b&&!W(a,"AREA"))return null;var c=b?a:W(a.parentNode,"MAP")?a.parentNode:null,d=null,e=null;c&&c.name&&(d=Dc('/descendant::*[@usemap = "#'+c.name+'"]',A(c)))&&(e=Jc(d),b||"default"==a.shape.toLowerCase()||(a=Oc(a),b=Math.min(Math.max(a.a,0),e.width),c=Math.min(Math.max(a.b,0),e.height),e=new X(b+e.a,c+e.b,Math.min(a.width,e.width-b),Math.min(a.height,e.height-c))));return{image:d,rect:e||new X(0,0,0,0)}}
function Oc(a){var b=a.shape.toLowerCase();a=a.coords.split(",");if("rect"==b&&4==a.length){b=a[0];var c=a[1];return new X(b,c,a[2]-b,a[3]-c)}if("circle"==b&&3==a.length)return b=a[2],new X(a[0]-b,a[1]-b,2*b,2*b);if("poly"==b&&2<a.length){b=a[0];c=a[1];for(var d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=Math.min(c,a[f+1]),e=Math.max(e,a[f+1]);return new X(b,c,d-b,e-c)}return new X(0,0,0,0)}function Nc(a){a=Jc(a);return new Ec(a.b,a.a+a.width,a.b+a.height,a.a)}
function Mc(a){if(Ac){if("relative"==Y(a,"position"))return 1;a=Y(a,"filter");return(a=a.match(/^alpha\(opacity=(\d*)\)/)||a.match(/^progid:DXImageTransform.Microsoft.Alpha\(Opacity=(\d*)\)/))?Number(a[1])/100:1}return Pc(a)}function Pc(a){var b=1,c=Y(a,"opacity");c&&(b=Number(c));(a=Gc(a))&&(b*=Pc(a));return b};ba("_",function(a,b){function c(d){if(W(d)&&"none"==Y(d,"display"))return!1;var e;if((e=d.parentNode)&&e.shadowRoot&&void 0!==d.assignedSlot)e=d.assignedSlot?d.assignedSlot.parentNode:null;else if(d.getDestinationInsertionPoints){var f=d.getDestinationInsertionPoints();0<f.length&&(e=f[f.length-1])}if(Fc&&e instanceof ShadowRoot){if(e.host.shadowRoot&&e.host.shadowRoot!==e)return!1;e=e.host}return!e||9!=e.nodeType&&11!=e.nodeType?e&&W(e,"DETAILS")&&!e.open&&!W(d,"SUMMARY")?!1:!!e&&c(e):!0}return Ic(a,
!!b,c)});; return this._.apply(null,arguments);}).apply({navigator:typeof window!='undefined'?window.navigator:null,document:typeof window!='undefined'?window.document:null}, arguments);};
seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};var ia="backgroundColor borderTopColor borderRightColor borderBottomColor borderLeftColor color outlineColor".split(" "),ja=/#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/,ka=/^#(?:[0-9a-f]{3}){1,2}$/i,la=/^(?:rgba)?\((\d{1,3}),\s?(\d{1,3}),\s?(\d{1,3}),\s?(0|1|0\.\d*)\)$/i,ma=/^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i;function m(a,b){this.code=a;this.a=p[a]||r;this.message=b||"";a=this.a.replace(/((?:^|\s+)[a-z])/g,function(c){return c.toUpperCase().replace(/^[\s\xa0]+/g,"")});b=a.length-5;if(0>b||a.indexOf("Error",b)!=b)a+="Error";this.name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||""}ca(m,Error);var r="unknown error",p={15:"element not selectable",11:"element not visible"};p[31]=r;p[30]=r;p[24]="invalid cookie domain";p[29]="invalid element coordinates";p[12]="invalid element state";
p[32]="invalid selector";p[51]="invalid selector";p[52]="invalid selector";p[17]="javascript error";p[405]="unsupported operation";p[34]="move target out of bounds";p[27]="no such alert";p[7]="no such element";p[8]="no such frame";p[23]="no such window";p[28]="script timeout";p[33]="session not created";p[10]="stale element reference";p[21]="timeout";p[25]="unable to set cookie";p[26]="unexpected alert open";p[13]=r;p[9]="unknown command";var u=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]};
function na(a,b){var c=0;a=u(String(a)).split(".");b=u(String(b)).split(".");for(var e=Math.max(a.length,b.length),d=0;0==c&&d<e;d++){var f=a[d]||"",h=b[d]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];h=/(\d*)(\D*)(.*)/.exec(h)||["","","",""];if(0==f[0].length&&0==h[0].length)break;c=v(0==f[1].length?0:parseInt(f[1],10),0==h[1].length?0:parseInt(h[1],10))||v(0==f[2].length,0==h[2].length)||v(f[2],h[2]);f=f[3];h=h[3]}while(0==c)}return c}function v(a,b){return a<b?-1:a>b?1:0};var w;a:{var oa=g.navigator;if(oa){var sa=oa.userAgent;if(sa){w=sa;break a}}w=""}function x(a){return-1!=w.indexOf(a)};function y(){return x("Firefox")||x("FxiOS")}function A(){return(x("Chrome")||x("CriOS"))&&!x("Edge")};function ta(a){return String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()})};function B(){return x("iPhone")&&!x("iPod")&&!x("iPad")};function ua(a,b){var c=va;return Object.prototype.hasOwnProperty.call(c,a)?c[a]:c[a]=b(a)};var wa=x("Opera"),C=x("Trident")||x("MSIE"),xa=x("Edge"),ya=x("Gecko")&&!(-1!=w.toLowerCase().indexOf("webkit")&&!x("Edge"))&&!(x("Trident")||x("MSIE"))&&!x("Edge"),za=-1!=w.toLowerCase().indexOf("webkit")&&!x("Edge");function Aa(){var a=g.document;return a?a.documentMode:void 0}var E;
a:{var F="",G=function(){var a=w;if(ya)return/rv:([^\);]+)(\)|;)/.exec(a);if(xa)return/Edge\/([\d\.]+)/.exec(a);if(C)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(za)return/WebKit\/(\S+)/.exec(a);if(wa)return/(?:Version)[ \/]?(\S+)/.exec(a)}();G&&(F=G?G[1]:"");if(C){var H=Aa();if(null!=H&&H>parseFloat(F)){E=String(H);break a}}E=F}var va={};function Ba(a){return ua(a,function(){return 0<=na(E,a)})}var I;I=g.document&&C?Aa():void 0;var Ca=y(),Da=B()||x("iPod"),Ea=x("iPad"),Fa=x("Android")&&!(A()||y()||x("Opera")||x("Silk")),Ga=A(),Ha=x("Safari")&&!(A()||x("Coast")||x("Opera")||x("Edge")||x("Edg/")||x("OPR")||y()||x("Silk")||x("Android"))&&!(B()||x("iPad")||x("iPod"));function J(a){return(a=a.exec(w))?a[1]:""}(function(){if(Ca)return J(/Firefox\/([0-9.]+)/);if(C||xa||wa)return E;if(Ga)return B()||x("iPad")||x("iPod")?J(/CriOS\/([0-9.]+)/):J(/Chrome\/([0-9.]+)/);if(Ha&&!(B()||x("iPad")||x("iPod")))return J(/Version\/([0-9.]+)/);if(Da||Ea){var a=/Version\/(\S+).*Mobile\/(\S+)/.exec(w);if(a)return a[1]+"."+a[2]}else if(Fa)return(a=J(/Android\s+([0-9.]+)/))?a:J(/Version\/([0-9.]+)/);return""})();var K;if(K=C)K=!(9<=Number(I));var Ia=K;function L(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b?b:0}L.prototype.ceil=function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};L.prototype.floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};L.prototype.round=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this};function M(a,b){this.width=a;this.height=b}M.prototype.aspectRatio=function(){return this.width/this.height};M.prototype.ceil=function(){this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};M.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};M.prototype.round=function(){this.width=Math.round(this.width);this.height=Math.round(this.height);return this};function N(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function Ja(a,b){a&&(a=a.parentNode);for(var c=0;a;){if(b(a))return a;a=a.parentNode;c++}return null}function Ka(a){this.a=a||g.document||document};function P(a,b){b&&"string"!==typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)};function Q(a,b,c,e){this.f=a;this.a=b;this.b=c;this.c=e}Q.prototype.ceil=function(){this.f=Math.ceil(this.f);this.a=Math.ceil(this.a);this.b=Math.ceil(this.b);this.c=Math.ceil(this.c);return this};Q.prototype.floor=function(){this.f=Math.floor(this.f);this.a=Math.floor(this.a);this.b=Math.floor(this.b);this.c=Math.floor(this.c);return this};Q.prototype.round=function(){this.f=Math.round(this.f);this.a=Math.round(this.a);this.b=Math.round(this.b);this.c=Math.round(this.c);return this};function R(a,b,c,e){this.a=a;this.b=b;this.width=c;this.height=e}R.prototype.ceil=function(){this.a=Math.ceil(this.a);this.b=Math.ceil(this.b);this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};R.prototype.floor=function(){this.a=Math.floor(this.a);this.b=Math.floor(this.b);this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};
R.prototype.round=function(){this.a=Math.round(this.a);this.b=Math.round(this.b);this.width=Math.round(this.width);this.height=Math.round(this.height);return this};var La="function"===typeof ShadowRoot;function S(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return P(a)?a:null}
function T(a,b){b=ta(b);if("float"==b||"cssFloat"==b||"styleFloat"==b)b=Ia?"styleFloat":"cssFloat";a:{var c=b;var e=N(a);if(e.defaultView&&e.defaultView.getComputedStyle&&(e=e.defaultView.getComputedStyle(a,null))){c=e[c]||e.getPropertyValue(c)||"";break a}c=""}a=c||Ma(a,b);if(null===a)a=null;else if(0<=da(ia,b)){b:{var d=a.match(la);if(d&&(b=Number(d[1]),c=Number(d[2]),e=Number(d[3]),d=Number(d[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=e&&255>=e&&0<=d&&1>=d)){b=[b,c,e,d];break b}b=null}if(!b)b:{if(e=a.match(ma))if(b=
Number(e[1]),c=Number(e[2]),e=Number(e[3]),0<=b&&255>=b&&0<=c&&255>=c&&0<=e&&255>=e){b=[b,c,e,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c=ha[b.toLowerCase()];if(!c&&(c="#"==b.charAt(0)?b:"#"+b,4==c.length&&(c=c.replace(ja,"#$1$1$2$2$3$3")),!ka.test(c))){b=null;break b}b=[parseInt(c.substr(1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(5,2),16),1]}a=b?"rgba("+b.join(", ")+")":a}return a}
function Ma(a,b){var c=a.currentStyle||a.style,e=c[b];void 0===e&&"function"==aa(c.getPropertyValue)&&(e=c.getPropertyValue(b));return"inherit"!=e?void 0!==e?e:null:(a=S(a))?Ma(a,b):null}
function U(a,b,c){function e(h){var n=V(h);return 0<n.height&&0<n.width?!0:P(h,"PATH")&&(0<n.height||0<n.width)?(h=T(h,"stroke-width"),!!h&&0<parseInt(h,10)):"hidden"!=T(h,"overflow")&&ea(h.childNodes,function(D){return 3==D.nodeType||P(D)&&e(D)})}function d(h){return Na(h)==W&&fa(h.childNodes,function(n){return!P(n)||d(n)||!e(n)})}if(!P(a))throw Error("Argument to isShown must be of type Element");if(P(a,"BODY"))return!0;if(P(a,"OPTION")||P(a,"OPTGROUP"))return a=Ja(a,function(h){return P(h,"SELECT")}),
!!a&&U(a,!0,c);var f=Oa(a);if(f)return!!f.image&&0<f.rect.width&&0<f.rect.height&&U(f.image,b,c);if(P(a,"INPUT")&&"hidden"==a.type.toLowerCase()||P(a,"NOSCRIPT"))return!1;f=T(a,"visibility");return"collapse"!=f&&"hidden"!=f&&c(a)&&(b||0!=Pa(a))&&e(a)?!d(a):!1}var W="hidden";
function Na(a){function b(k){function l(ba){if(ba==h)return!0;var pa=T(ba,"display");return 0==pa.lastIndexOf("inline",0)||"contents"==pa||"absolute"==qa&&"static"==T(ba,"position")?!1:!0}var qa=T(k,"position");if("fixed"==qa)return ra=!0,k==h?null:h;for(k=S(k);k&&!l(k);)k=S(k);return k}function c(k){var l=k;if("visible"==D)if(k==h&&n)l=n;else if(k==n)return{x:"visible",y:"visible"};l={x:T(l,"overflow-x"),y:T(l,"overflow-y")};k==h&&(l.x="visible"==l.x?"auto":l.x,l.y="visible"==l.y?"auto":l.y);return l}
function e(k){if(k==h){var l=(new Ka(f)).a;k=l.scrollingElement?l.scrollingElement:za||"CSS1Compat"!=l.compatMode?l.body||l.documentElement:l.documentElement;l=l.parentWindow||l.defaultView;k=C&&Ba("10")&&l.pageYOffset!=k.scrollTop?new L(k.scrollLeft,k.scrollTop):new L(l.pageXOffset||k.scrollLeft,l.pageYOffset||k.scrollTop)}else k=new L(k.scrollLeft,k.scrollTop);return k}var d=Qa(a),f=N(a),h=f.documentElement,n=f.body,D=T(h,"overflow"),ra;for(a=b(a);a;a=b(a)){var q=c(a);if("visible"!=q.x||"visible"!=
q.y){var t=V(a);if(0==t.width||0==t.height)return W;var z=d.a<t.a,O=d.b<t.b;if(z&&"hidden"==q.x||O&&"hidden"==q.y)return W;if(z&&"visible"!=q.x||O&&"visible"!=q.y){z=e(a);O=d.b<t.b-z.y;if(d.a<t.a-z.x&&"visible"!=q.x||O&&"visible"!=q.x)return W;d=Na(a);return d==W?W:"scroll"}z=d.c>=t.a+t.width;t=d.f>=t.b+t.height;if(z&&"hidden"==q.x||t&&"hidden"==q.y)return W;if(z&&"visible"!=q.x||t&&"visible"!=q.y){if(ra&&(q=e(a),d.c>=h.scrollWidth-q.x||d.a>=h.scrollHeight-q.y))return W;d=Na(a);return d==W?W:"scroll"}}}return"none"}
function V(a){var b=Oa(a);if(b)return b.rect;if(P(a,"HTML"))return a=N(a),a=((a?a.parentWindow||a.defaultView:window)||window).document,a="CSS1Compat"==a.compatMode?a.documentElement:a.body,a=new M(a.clientWidth,a.clientHeight),new R(0,0,a.width,a.height);try{var c=a.getBoundingClientRect()}catch(e){return new R(0,0,0,0)}b=new R(c.left,c.top,c.right-c.left,c.bottom-c.top);C&&a.ownerDocument.body&&(a=N(a),b.a-=a.documentElement.clientLeft+a.body.clientLeft,b.b-=a.documentElement.clientTop+a.body.clientTop);
return b}
function Oa(a){var b=P(a,"MAP");if(!b&&!P(a,"AREA"))return null;var c=b?a:P(a.parentNode,"MAP")?a.parentNode:null,e=null,d=null;if(c&&c.name){e='*[usemap="#'+c.name+'"]';c=N(c);var f;if(f="function"!=aa(c.querySelector)&&C&&(C?0<=na(I,8):Ba(8))){f=c.querySelector;var h=typeof f;f=!("object"==h&&null!=f||"function"==h)}if(f)throw Error("CSS selection is not supported");if(!e)throw new m(32,"No selector specified");e=u(e);try{var n=c.querySelector(e)}catch(D){throw new m(32,"An invalid or illegal selector was specified");}if(e=
n&&1==n.nodeType?n:null)d=V(e),b||"default"==a.shape.toLowerCase()||(a=Ra(a),b=Math.min(Math.max(a.a,0),d.width),n=Math.min(Math.max(a.b,0),d.height),d=new R(b+d.a,n+d.b,Math.min(a.width,d.width-b),Math.min(a.height,d.height-n)))}return{image:e,rect:d||new R(0,0,0,0)}}
function Ra(a){var b=a.shape.toLowerCase();a=a.coords.split(",");if("rect"==b&&4==a.length){b=a[0];var c=a[1];return new R(b,c,a[2]-b,a[3]-c)}if("circle"==b&&3==a.length)return b=a[2],new R(a[0]-b,a[1]-b,2*b,2*b);if("poly"==b&&2<a.length){b=a[0];c=a[1];for(var e=b,d=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),e=Math.max(e,a[f]),c=Math.min(c,a[f+1]),d=Math.max(d,a[f+1]);return new R(b,c,e-b,d-c)}return new R(0,0,0,0)}function Qa(a){a=V(a);return new Q(a.b,a.a+a.width,a.b+a.height,a.a)}
function Pa(a){if(Ia){if("relative"==T(a,"position"))return 1;a=T(a,"filter");return(a=a.match(/^alpha\(opacity=(\d*)\)/)||a.match(/^progid:DXImageTransform.Microsoft.Alpha\(Opacity=(\d*)\)/))?Number(a[1])/100:1}return Sa(a)}function Sa(a){var b=1,c=T(a,"opacity");c&&(b=Number(c));(a=S(a))&&(b*=Sa(a));return b};function Ta(a,b){function c(e){if(P(e)&&"none"==T(e,"display"))return!1;var d;if((d=e.parentNode)&&d.shadowRoot&&void 0!==e.assignedSlot)d=e.assignedSlot?e.assignedSlot.parentNode:null;else if(e.getDestinationInsertionPoints){var f=e.getDestinationInsertionPoints();0<f.length&&(d=f[f.length-1])}if(La&&d instanceof ShadowRoot){if(d.host.shadowRoot&&d.host.shadowRoot!==d)return!1;d=d.host}return!d||9!=d.nodeType&&11!=d.nodeType?d&&P(d,"DETAILS")&&!d.open&&!P(e,"SUMMARY")?!1:!!d&&c(d):!0}return U(a,
!!b,c)}var X=["_"],Y=g;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===Ta?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=Ta;; return this._.apply(null,arguments);}).apply({navigator:typeof window!='undefined'?window.navigator:null,document:typeof window!='undefined'?window.document:null}, arguments);};

@@ -249,2 +249,7 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

/** @return {number} The number of capabilities set. */
get size() {
return this.map_.size
}
/**

@@ -319,7 +324,2 @@ * @return {!Capabilities} A basic set of capabilities for Chrome.

/** @return {number} The number of capabilities set. */
get size() {
return this.map_.size
}
/**

@@ -326,0 +326,0 @@ * Merges another set of capabilities into this instance.

@@ -150,8 +150,11 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

}
function del(path) {
return resource('DELETE', path)
}
function get(path) {
return resource('GET', path)
}
function resource(method, path) {

@@ -158,0 +161,0 @@ return { method: method, path: path }

@@ -164,5 +164,5 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

<select id="selectbox">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>

@@ -169,0 +169,0 @@ const selectBox = await driver.findElement(By.id("selectbox"));

@@ -131,2 +131,10 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

static createResidentCredential(id, rpId, userHandle, privateKey, signCount) {
return new Credential(id, true, rpId, userHandle, privateKey, signCount)
}
static createNonResidentCredential(id, rpId, privateKey, signCount) {
return new Credential(id, false, rpId, null, privateKey, signCount)
}
id() {

@@ -173,6 +181,2 @@ return this._id

static createResidentCredential(id, rpId, userHandle, privateKey, signCount) {
return new Credential(id, true, rpId, userHandle, privateKey, signCount)
}
/**

@@ -191,6 +195,2 @@ * Creates a non-resident (i.e. stateless) credential.

static createNonResidentCredential(id, rpId, privateKey, signCount) {
return new Credential(id, false, rpId, null, privateKey, signCount)
}
toDict() {

@@ -197,0 +197,0 @@ let credentialData = {

{
"name": "selenium-webdriver",
"version": "4.18.1",
"version": "4.19.0",
"description": "The official WebDriver JavaScript bindings from the Selenium project",

@@ -27,17 +27,19 @@ "license": "Apache-2.0",

"jszip": "^3.10.1",
"tmp": "^0.2.1",
"ws": ">=8.14.2"
"tmp": "^0.2.3",
"ws": ">=8.16.0"
},
"devDependencies": {
"eslint": "^8.50.0",
"eslint-config-prettier": "^9.0.0",
"@bazel/runfiles": "^5.8.1",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-no-only-tests": "^3.1.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^5.0.0",
"express": "^4.18.2",
"mocha": "^10.2.0",
"eslint-plugin-prettier": "^5.1.3",
"express": "^4.19.2",
"mocha": "^10.3.0",
"mocha-junit-reporter": "^2.2.1",
"multer": "^1.4.5-lts.1",
"prettier": "^3.0.3",
"prettier": "^3.2.5",
"serve-index": "^1.9.1",
"sinon": "^16.1.0"
"sinon": "^17.0.1"
},

@@ -44,0 +46,0 @@ "scripts": {

@@ -16,16 +16,15 @@ # selenium-webdriver

browsers are all standalone executables that should be placed on your system
[PATH]. Apple's safaridriver (v10 and above) can be found at the
following path – /usr/bin/safaridriver. To enable automation on safari,
[PATH]. Apple's safaridriver (v10 and above) can be found at the
following path – /usr/bin/safaridriver. To enable automation on safari,
you need to run command `safaridriver --enable`.
| Browser | Component |
| :---------------- | :------------------------------- |
| Chrome | [chromedriver(.exe)][chrome] |
| Internet Explorer | [IEDriverServer.exe][release] |
| Edge | [MicrosoftWebDriver.msi][edge] |
| Firefox | [geckodriver(.exe)][geckodriver] |
| Opera | [operadriver(.exe)][operadriver] |
| Safari | [safaridriver] |
| Browser | Component |
|:-------------------|:------------------------------------|
| Chrome | [chromedriver(.exe)][chrome] |
| Internet Explorer | [IEDriverServer.exe][release] |
| Edge | [MicrosoftWebDriver.msi][edge] |
| Firefox | [geckodriver(.exe)][geckodriver] |
| Opera | [operadriver(.exe)][operadriver] |
| Safari | [safaridriver] |
## Usage

@@ -37,14 +36,14 @@

```javascript
const {Builder, Browser, By, Key, until} = require('selenium-webdriver');
const { Builder, Browser, By, Key, until } = require('selenium-webdriver')
(async function example() {
let driver = await new Builder().forBrowser(Browser.FIREFOX).build();
;(async function example() {
let driver = await new Builder().forBrowser(Browser.FIREFOX).build()
try {
await driver.get('https://www.google.com/ncr');
await driver.findElement(By.name('q')).sendKeys('webdriver', Key.RETURN);
await driver.wait(until.titleIs('webdriver - Google Search'), 1000);
await driver.get('https://www.google.com/ncr')
await driver.findElement(By.name('q')).sendKeys('webdriver', Key.RETURN)
await driver.wait(until.titleIs('webdriver - Google Search'), 1000)
} finally {
await driver.quit();
await driver.quit()
}
})();
})()
```

@@ -60,11 +59,11 @@

```javascript
const webdriver = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const firefox = require('selenium-webdriver/firefox');
const webdriver = require('selenium-webdriver')
const chrome = require('selenium-webdriver/chrome')
const firefox = require('selenium-webdriver/firefox')
let driver = new webdriver.Builder()
.forBrowser(webdriver.Browser.FIREFOX)
.setChromeOptions(/* ... */)
.setFirefoxOptions(/* ... */)
.build();
.forBrowser(webdriver.Browser.FIREFOX)
.setChromeOptions(/* ... */)
.setFirefoxOptions(/* ... */)
.build()
```

@@ -105,6 +104,7 @@

let driver = new webdriver.Builder()
.forBrowser(webdriver.Browser.FIREFOX)
.usingServer('http://localhost:4444/wd/hub')
.build();
.forBrowser(webdriver.Browser.FIREFOX)
.usingServer('http://localhost:4444/wd/hub')
.build()
```
Or change the Builder's configuration at runtime with the `SELENIUM_REMOTE_URL`

@@ -142,13 +142,14 @@ environment variable:

For example, suppose the current LTS and stable releases are v14.20.0 and v18.8.0,
For example, suppose the current LTS and stable releases are v14.20.0 and
v18.8.0,
respectively. Then a Selenium release would have the following support levels:
| Version | Support |
|:----------:|:---------------:|
| <= 14.19 | _unsupported_ |
| 14.20.0 | supported |
| 18.0-7 | best effort |
| 18.8.0 | supported |
| >= 18.8.0 | best effort |
| v.Next | _unsupported_ |
| Version | Support |
| :-------: | :-----------: |
| <= 14.19 | _unsupported_ |
| 14.20.0 | supported |
| 18.0-7 | best effort |
| 18.8.0 | supported |
| >= 18.8.0 | best effort |
| v.Next | _unsupported_ |

@@ -158,11 +159,11 @@ ### Support Level Definitions

- _supported:_ A selenium-webdriver release will be API compatible with the
platform API, without the use of runtime flags.
platform API, without the use of runtime flags.
- _best effort:_ Bugs will be investigated as time permits. API compatibility is
only guaranteed where required by a _supported_ release. This effectively
means the adoption of new JS features, such as ES2015 modules, will depend
on what is supported in Node's LTS.
only guaranteed where required by a _supported_ release. This effectively
means the adoption of new JS features, such as ES2015 modules, will depend
on what is supported in Node's LTS.
- _unsupported:_ Bug submissions will be closed as will-not-fix and API
compatibility is not guaranteed.
compatibility is not guaranteed.

@@ -174,9 +175,9 @@ ### Projected Support Schedule

| Release | Status | END-OF-LIFE |
|:---------:|:----------------:|:------------:|
| v14.x | Maintenance LTS | 2023-04-30 |
| v16.x | Active LTS | 2023-09-11 |
| v18.x | Current | 2025-04-30 |
| v19.x | Pending | 2023-06-01 |
| v20 | Pending | 2026-04-30 |
| Release | Status | END-OF-LIFE |
| :-----: | :-------------: | :---------: |
| v14.x | Maintenance LTS | 2023-04-30 |
| v16.x | Active LTS | 2023-09-11 |
| v18.x | Current | 2025-04-30 |
| v19.x | Pending | 2023-06-01 |
| v20 | Pending | 2026-04-30 |

@@ -188,18 +189,18 @@ ## Issues

- __Do__ include a detailed description of the problem.
- __Do__ include a link to a [gist](http://gist.github.com/) with any
interesting stack traces/logs (you may also attach these directly to the bug
report).
- __Do__ include a [reduced test case][reduction]. Reporting "unable to find
element on the page" is _not_ a valid report - there's nothing for us to
look into. Expect your bug report to be closed if you do not provide enough
information for us to investigate.
- __Do not__ use the issue tracker to submit basic help requests. All help
inquiries should be directed to the [user forum][users] or #selenium IRC
channel.
- __Do not__ post empty "I see this too" or "Any updates?" comments. These
provide no additional information and clutter the log.
- __Do not__ report regressions on closed bugs as they are not actively
monitored for updates (especially bugs that are >6 months old). Please open a
new issue and reference the original bug in your report.
- **Do** include a detailed description of the problem.
- **Do** include a link to a [gist](http://gist.github.com/) with any
interesting stack traces/logs (you may also attach these directly to the bug
report).
- **Do** include a [reduced test case][reduction]. Reporting "unable to find
element on the page" is _not_ a valid report - there's nothing for us to
look into. Expect your bug report to be closed if you do not provide enough
information for us to investigate.
- **Do not** use the issue tracker to submit basic help requests. All help
inquiries should be directed to the [user forum][users] or #selenium IRC
channel.
- **Do not** post empty "I see this too" or "Any updates?" comments. These
provide no additional information and clutter the log.
- **Do not** report regressions on closed bugs as they are not actively
monitored for updates (especially bugs that are >6 months old). Please open a
new issue and reference the original bug in your report.

@@ -209,8 +210,8 @@ ## License

Licensed to the Software Freedom Conservancy (SFC) under one
or more contributor license agreements. See the NOTICE file
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The SFC licenses this file
regarding copyright ownership. The SFC licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
with the License. You may obtain a copy of the License at

@@ -222,3 +223,3 @@ http://www.apache.org/licenses/LICENSE-2.0

"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
KIND, either express or implied. See the License for the
specific language governing permissions and limitations

@@ -236,7 +237,5 @@ under the License.

[reduction]: http://www.webkit.org/quality/reduction.html
[release]: https://www.selenium.dev/downloads/
[users]: https://groups.google.com/forum/#!forum/selenium-users
[safaridriver]: https://developer.apple.com/library/prerelease/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_10_0.html#//apple_ref/doc/uid/TP40014305-CH11-DontLinkElementID_28
[operadriver]: https://github.com/operasoftware/operachromiumdriver/releases

@@ -75,11 +75,15 @@ // Licensed to the Software Freedom Conservancy (SFC) under one

}
function green(s) {
return color(32, s)
}
function cyan(s) {
return color(36, s)
}
function info(msg) {
console.info(`${green('[INFO]')} ${msg}`)
}
function warn(msg) {

@@ -400,2 +404,3 @@ console.warn(`${cyan('[WARNING]')} ${msg}`)

const startTimeout = 65 * 1000
// eslint-disable-next-line no-inner-declarations

@@ -402,0 +407,0 @@ function startSelenium() {

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc