forked from annv/MinigameTest
555 lines
14 KiB
JavaScript
555 lines
14 KiB
JavaScript
// Licensed to the Software Freedom Conservancy (SFC) under one
|
||
// or more contributor license agreements. See the NOTICE file
|
||
// distributed with this work for additional information
|
||
// 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
|
||
//
|
||
// http://www.apache.org/licenses/LICENSE-2.0
|
||
//
|
||
// Unless required by applicable law or agreed to in writing,
|
||
// software distributed under the License is distributed on an
|
||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||
// KIND, either express or implied. See the License for the
|
||
// specific language governing permissions and limitations
|
||
// under the License.
|
||
|
||
'use strict'
|
||
|
||
/**
|
||
* @fileoverview Defines types related to describing the capabilities of a
|
||
* WebDriver session.
|
||
*/
|
||
|
||
const Symbols = require('./symbols')
|
||
|
||
/**
|
||
* Recognized browser names.
|
||
* @enum {string}
|
||
*/
|
||
const Browser = {
|
||
CHROME: 'chrome',
|
||
EDGE: 'MicrosoftEdge',
|
||
FIREFOX: 'firefox',
|
||
INTERNET_EXPLORER: 'internet explorer',
|
||
SAFARI: 'safari',
|
||
}
|
||
|
||
/**
|
||
* Strategies for waiting for [document readiness] after a navigation
|
||
* event.
|
||
*
|
||
* [document readiness]: https://html.spec.whatwg.org/#current-document-readiness
|
||
*
|
||
* @enum {string}
|
||
*/
|
||
const PageLoadStrategy = {
|
||
/**
|
||
* Indicates WebDriver should not wait on the document readiness state after a
|
||
* navigation event.
|
||
*/
|
||
NONE: 'none',
|
||
|
||
/**
|
||
* Indicates WebDriver should wait for the document readiness state to
|
||
* become "interactive" after navigation.
|
||
*/
|
||
EAGER: 'eager',
|
||
|
||
/**
|
||
* Indicates WebDriver should wait for the document readiness state to
|
||
* be "complete" after navigation. This is the default page loading strategy.
|
||
*/
|
||
NORMAL: 'normal',
|
||
}
|
||
|
||
/**
|
||
* Common platform names. These platforms are not explicitly defined by the
|
||
* WebDriver spec, however, their use is encouraged for interoperability.
|
||
*
|
||
* @enum {string}
|
||
* @see <https://w3c.github.io/webdriver/webdriver-spec.html>
|
||
*/
|
||
const Platform = {
|
||
LINUX: 'linux',
|
||
MAC: 'mac',
|
||
WINDOWS: 'windows',
|
||
}
|
||
|
||
/**
|
||
* Record object defining the timeouts that apply to certain WebDriver actions.
|
||
*
|
||
* @record
|
||
*/
|
||
function Timeouts() {}
|
||
|
||
/**
|
||
* Defines when, in milliseconds, to interrupt a script that is being
|
||
* {@linkplain ./webdriver.IWebDriver#executeScript evaluated}.
|
||
* @type {number}
|
||
*/
|
||
Timeouts.prototype.script
|
||
|
||
/**
|
||
* The timeout, in milliseconds, to apply to navigation events along with the
|
||
* {@link PageLoadStrategy}.
|
||
* @type {number}
|
||
*/
|
||
Timeouts.prototype.pageLoad
|
||
|
||
/**
|
||
* The maximum amount of time, in milliseconds, to spend attempting to
|
||
* {@linkplain ./webdriver.IWebDriver#findElement locate} an element on the
|
||
* current page.
|
||
* @type {number}
|
||
*/
|
||
Timeouts.prototype.implicit
|
||
|
||
/**
|
||
* The possible default actions a WebDriver session can take to respond to
|
||
* unhandled user prompts (`window.alert()`, `window.confirm()`, and
|
||
* `window.prompt()`).
|
||
*
|
||
* @enum {string}
|
||
*/
|
||
const UserPromptHandler = {
|
||
/** All prompts should be silently accepted. */
|
||
ACCEPT: 'accept',
|
||
/** All prompts should be silently dismissed. */
|
||
DISMISS: 'dismiss',
|
||
/**
|
||
* All prompts should be automatically accepted, but an error should be
|
||
* returned to the next (or currently executing) WebDriver command.
|
||
*/
|
||
ACCEPT_AND_NOTIFY: 'accept and notify',
|
||
/**
|
||
* All prompts should be automatically dismissed, but an error should be
|
||
* returned to the next (or currently executing) WebDriver command.
|
||
*/
|
||
DISMISS_AND_NOTIFY: 'dismiss and notify',
|
||
/** All prompts should be left unhandled. */
|
||
IGNORE: 'ignore',
|
||
}
|
||
|
||
/**
|
||
* The standard WebDriver capability keys.
|
||
*
|
||
* @enum {string}
|
||
* @see <https://w3c.github.io/webdriver/webdriver-spec.html#capabilities>
|
||
*/
|
||
const Capability = {
|
||
/**
|
||
* Indicates whether a WebDriver session implicitly trusts otherwise untrusted
|
||
* and self-signed TLS certificates during navigation.
|
||
*/
|
||
ACCEPT_INSECURE_TLS_CERTS: 'acceptInsecureCerts',
|
||
|
||
/**
|
||
* The browser name. Common browser names are defined in the
|
||
* {@link ./capabilities.Browser Browser} enum.
|
||
*/
|
||
BROWSER_NAME: 'browserName',
|
||
|
||
/** Identifies the browser version. */
|
||
BROWSER_VERSION: 'browserVersion',
|
||
|
||
/**
|
||
* Key for the logging driver logging preferences.
|
||
* The browser name. Common browser names are defined in the
|
||
* {@link ./capabilities.Browser Browser} enum.
|
||
*/
|
||
LOGGING_PREFS: 'goog:loggingPrefs',
|
||
|
||
/**
|
||
* Defines the session's
|
||
* {@linkplain ./capabilities.PageLoadStrategy page loading strategy}.
|
||
*/
|
||
PAGE_LOAD_STRATEGY: 'pageLoadStrategy',
|
||
|
||
/**
|
||
* Identifies the operating system of the endpoint node. Common values
|
||
* recognized by the most WebDriver server implementations are predefined in
|
||
* the {@link ./capabilities.Platform Platform} enum.
|
||
*/
|
||
PLATFORM_NAME: 'platformName',
|
||
|
||
/**
|
||
* Describes the proxy configuration to use for a new WebDriver session.
|
||
*/
|
||
PROXY: 'proxy',
|
||
|
||
/**
|
||
* Indicates whether the remote end supports all of the window resizing and
|
||
* positioning commands:
|
||
*
|
||
* - {@linkplain ./webdriver.Window#getRect Window.getRect()}
|
||
* - {@linkplain ./webdriver.Window#setRect Window.setRect()}
|
||
* - {@linkplain ./webdriver.Window#maximize Window.maximize()}
|
||
* - {@linkplain ./webdriver.Window#minimize Window.minimize()}
|
||
* - {@linkplain ./webdriver.Window#fullscreen Window.fullscreen()}
|
||
*/
|
||
SET_WINDOW_RECT: 'setWindowRect',
|
||
|
||
/**
|
||
* Describes the {@linkplain ./capabilities.Timeouts timeouts} imposed on
|
||
* certain session operations.
|
||
*/
|
||
TIMEOUTS: 'timeouts',
|
||
|
||
/**
|
||
* Defines how a WebDriver session should
|
||
* {@linkplain ./capabilities.UserPromptHandler respond} to unhandled user
|
||
* prompts.
|
||
*/
|
||
UNHANDLED_PROMPT_BEHAVIOR: 'unhandledPromptBehavior',
|
||
|
||
/**
|
||
* Defines the current session’s strict file interactability.
|
||
* Used to upload a file when strict file interactability is on
|
||
*/
|
||
STRICT_FILE_INTERACTABILITY: 'strictFileInteractability',
|
||
}
|
||
|
||
/**
|
||
* Converts a generic hash object to a map.
|
||
* @param {!Object<string, ?>} hash The hash object.
|
||
* @return {!Map<string, ?>} The converted map.
|
||
*/
|
||
function toMap(hash) {
|
||
let m = new Map()
|
||
for (let key in hash) {
|
||
if (Object.prototype.hasOwnProperty.call(hash, key)) {
|
||
m.set(key, hash[key])
|
||
}
|
||
}
|
||
return m
|
||
}
|
||
|
||
/**
|
||
* Describes a set of capabilities for a WebDriver session.
|
||
*/
|
||
class Capabilities {
|
||
/**
|
||
* @param {(Capabilities|Map<string, ?>|Object)=} other Another set of
|
||
* capabilities to initialize this instance from.
|
||
*/
|
||
constructor(other = undefined) {
|
||
if (other instanceof Capabilities) {
|
||
other = other.map_
|
||
} else if (other && !(other instanceof Map)) {
|
||
other = toMap(other)
|
||
}
|
||
/** @private @const {!Map<string, ?>} */
|
||
this.map_ = new Map(other)
|
||
}
|
||
|
||
/**
|
||
* @return {!Capabilities} A basic set of capabilities for Chrome.
|
||
*/
|
||
static chrome() {
|
||
return new Capabilities().setBrowserName(Browser.CHROME)
|
||
}
|
||
|
||
/**
|
||
* @return {!Capabilities} A basic set of capabilities for Microsoft Edge.
|
||
*/
|
||
static edge() {
|
||
return new Capabilities().setBrowserName(Browser.EDGE)
|
||
}
|
||
|
||
/**
|
||
* @return {!Capabilities} A basic set of capabilities for Firefox.
|
||
*/
|
||
static firefox() {
|
||
return new Capabilities()
|
||
.setBrowserName(Browser.FIREFOX)
|
||
.set('moz:debuggerAddress', true)
|
||
}
|
||
|
||
/**
|
||
* @return {!Capabilities} A basic set of capabilities for Internet Explorer.
|
||
*/
|
||
static ie() {
|
||
return new Capabilities().setBrowserName(Browser.INTERNET_EXPLORER)
|
||
}
|
||
|
||
/**
|
||
* @return {!Capabilities} A basic set of capabilities for Safari.
|
||
*/
|
||
static safari() {
|
||
return new Capabilities().setBrowserName(Browser.SAFARI)
|
||
}
|
||
|
||
/**
|
||
* @return {!Object<string, ?>} The JSON representation of this instance.
|
||
* Note, the returned object may contain nested promised values.
|
||
* @suppress {checkTypes} Suppress [] access on a struct (state inherited from
|
||
* Map).
|
||
*/
|
||
[Symbols.serialize]() {
|
||
return serialize(this)
|
||
}
|
||
|
||
/**
|
||
* @param {string} key the parameter key to get.
|
||
* @return {T} the stored parameter value.
|
||
* @template T
|
||
*/
|
||
get(key) {
|
||
return this.map_.get(key)
|
||
}
|
||
|
||
/**
|
||
* @param {string} key the key to test.
|
||
* @return {boolean} whether this capability set has the specified key.
|
||
*/
|
||
has(key) {
|
||
return this.map_.has(key)
|
||
}
|
||
|
||
/**
|
||
* @return {!Iterator<string>} an iterator of the keys set.
|
||
*/
|
||
keys() {
|
||
return this.map_.keys()
|
||
}
|
||
|
||
/** @return {number} The number of capabilities set. */
|
||
get size() {
|
||
return this.map_.size
|
||
}
|
||
|
||
/**
|
||
* Merges another set of capabilities into this instance.
|
||
* @param {!(Capabilities|Map<String, ?>|Object<string, ?>)} other The other
|
||
* set of capabilities to merge.
|
||
* @return {!Capabilities} A self reference.
|
||
*/
|
||
merge(other) {
|
||
if (other) {
|
||
let otherMap
|
||
if (other instanceof Capabilities) {
|
||
otherMap = other.map_
|
||
} else if (other instanceof Map) {
|
||
otherMap = other
|
||
} else {
|
||
otherMap = toMap(other)
|
||
}
|
||
otherMap.forEach((value, key) => {
|
||
this.set(key, value)
|
||
})
|
||
return this
|
||
} else {
|
||
throw new TypeError('no capabilities provided for merge')
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Deletes an entry from this set of capabilities.
|
||
*
|
||
* @param {string} key the capability key to delete.
|
||
*/
|
||
delete(key) {
|
||
this.map_.delete(key)
|
||
}
|
||
|
||
/**
|
||
* @param {string} key The capability key.
|
||
* @param {*} value The capability value.
|
||
* @return {!Capabilities} A self reference.
|
||
* @throws {TypeError} If the `key` is not a string.
|
||
*/
|
||
set(key, value) {
|
||
if (typeof key !== 'string') {
|
||
throw new TypeError('Capability keys must be strings: ' + typeof key)
|
||
}
|
||
this.map_.set(key, value)
|
||
return this
|
||
}
|
||
|
||
/**
|
||
* Sets whether a WebDriver session should implicitly accept self-signed, or
|
||
* other untrusted TLS certificates on navigation.
|
||
*
|
||
* @param {boolean} accept whether to accept insecure certs.
|
||
* @return {!Capabilities} a self reference.
|
||
*/
|
||
setAcceptInsecureCerts(accept) {
|
||
return this.set(Capability.ACCEPT_INSECURE_TLS_CERTS, accept)
|
||
}
|
||
|
||
/**
|
||
* @return {boolean} whether the session is configured to accept insecure
|
||
* TLS certificates.
|
||
*/
|
||
getAcceptInsecureCerts() {
|
||
return this.get(Capability.ACCEPT_INSECURE_TLS_CERTS)
|
||
}
|
||
|
||
/**
|
||
* Sets the name of the target browser.
|
||
*
|
||
* @param {(Browser|string)} name the browser name.
|
||
* @return {!Capabilities} a self reference.
|
||
*/
|
||
setBrowserName(name) {
|
||
return this.set(Capability.BROWSER_NAME, name)
|
||
}
|
||
|
||
/**
|
||
* @return {(string|undefined)} the configured browser name, or undefined if
|
||
* not set.
|
||
*/
|
||
getBrowserName() {
|
||
return this.get(Capability.BROWSER_NAME)
|
||
}
|
||
|
||
/**
|
||
* Sets the desired version of the target browser.
|
||
*
|
||
* @param {string} version the desired version.
|
||
* @return {!Capabilities} a self reference.
|
||
*/
|
||
setBrowserVersion(version) {
|
||
return this.set(Capability.BROWSER_VERSION, version)
|
||
}
|
||
|
||
/**
|
||
* @return {(string|undefined)} the configured browser version, or undefined
|
||
* if not set.
|
||
*/
|
||
getBrowserVersion() {
|
||
return this.get(Capability.BROWSER_VERSION)
|
||
}
|
||
|
||
/**
|
||
* Sets the desired page loading strategy for a new WebDriver session.
|
||
*
|
||
* @param {PageLoadStrategy} strategy the desired strategy.
|
||
* @return {!Capabilities} a self reference.
|
||
*/
|
||
setPageLoadStrategy(strategy) {
|
||
return this.set(Capability.PAGE_LOAD_STRATEGY, strategy)
|
||
}
|
||
|
||
/**
|
||
* Returns the configured page load strategy.
|
||
*
|
||
* @return {(string|undefined)} the page load strategy.
|
||
*/
|
||
getPageLoadStrategy() {
|
||
return this.get(Capability.PAGE_LOAD_STRATEGY)
|
||
}
|
||
|
||
/**
|
||
* Sets the target platform.
|
||
*
|
||
* @param {(Platform|string)} platform the target platform.
|
||
* @return {!Capabilities} a self reference.
|
||
*/
|
||
setPlatform(platform) {
|
||
return this.set(Capability.PLATFORM_NAME, platform)
|
||
}
|
||
|
||
/**
|
||
* @return {(string|undefined)} the configured platform or undefined if not
|
||
* set.
|
||
*/
|
||
getPlatform() {
|
||
return this.get(Capability.PLATFORM_NAME)
|
||
}
|
||
|
||
/**
|
||
* Sets the logging preferences. Preferences may be specified as a
|
||
* {@link ./logging.Preferences} instance, or as a map of log-type to
|
||
* log-level.
|
||
* @param {!(./logging.Preferences|Object<string>)} prefs The logging
|
||
* preferences.
|
||
* @return {!Capabilities} A self reference.
|
||
*/
|
||
setLoggingPrefs(prefs) {
|
||
return this.set(Capability.LOGGING_PREFS, prefs)
|
||
}
|
||
|
||
/**
|
||
* Sets the proxy configuration for this instance.
|
||
* @param {proxy.Config} proxy The desired proxy configuration.
|
||
* @return {!Capabilities} A self reference.
|
||
*/
|
||
setProxy(proxy) {
|
||
return this.set(Capability.PROXY, proxy)
|
||
}
|
||
|
||
/**
|
||
* @return {(proxy.Config|undefined)} the configured proxy settings, or
|
||
* undefined if not set.
|
||
*/
|
||
getProxy() {
|
||
return this.get(Capability.PROXY)
|
||
}
|
||
|
||
/**
|
||
* Sets the default action to take with an unexpected alert before returning
|
||
* an error. If unspecified, WebDriver will default to
|
||
* {@link UserPromptHandler.DISMISS_AND_NOTIFY}.
|
||
*
|
||
* @param {?UserPromptHandler} behavior The way WebDriver should respond to
|
||
* unhandled user prompts.
|
||
* @return {!Capabilities} A self reference.
|
||
*/
|
||
setAlertBehavior(behavior) {
|
||
return this.set(Capability.UNHANDLED_PROMPT_BEHAVIOR, behavior)
|
||
}
|
||
|
||
/**
|
||
* @return {(UserPromptHandler|undefined)} the behavior pattern for responding
|
||
* to unhandled user prompts, or undefined if not set.
|
||
*/
|
||
getAlertBehavior() {
|
||
return this.get(Capability.UNHANDLED_PROMPT_BEHAVIOR)
|
||
}
|
||
|
||
/**
|
||
* Sets the boolean flag configuration for this instance.
|
||
*/
|
||
setStrictFileInteractability(strictFileInteractability) {
|
||
return this.set(
|
||
Capability.STRICT_FILE_INTERACTABILITY,
|
||
strictFileInteractability
|
||
)
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Serializes a capabilities object. This is defined as a standalone function
|
||
* so it may be type checked (where Capabilities[Symbols.serialize] has type
|
||
* checking disabled since it is defined with [] access on a struct).
|
||
*
|
||
* @param {!Capabilities} caps The capabilities to serialize.
|
||
* @return {!Object<string, ?>} The JSON representation of this instance.
|
||
* Note, the returned object may contain nested promised values.
|
||
*/
|
||
function serialize(caps) {
|
||
let ret = {}
|
||
for (let key of caps.keys()) {
|
||
let cap = caps.get(key)
|
||
if (cap !== undefined && cap !== null) {
|
||
ret[key] = cap
|
||
}
|
||
}
|
||
return ret
|
||
}
|
||
|
||
// PUBLIC API
|
||
|
||
module.exports = {
|
||
Browser,
|
||
Capabilities,
|
||
Capability,
|
||
PageLoadStrategy,
|
||
Platform,
|
||
Timeouts,
|
||
UserPromptHandler,
|
||
}
|