UNPKG

@types/selenium-webdriver

Version:
1,522 lines (1,333 loc) 109 kB
import { WebSocket } from "ws"; import LogInspector = require("./bidi/logInspector"); import * as chrome from "./chrome"; import { HttpResponse } from "./devtools/networkinterceptor"; import * as edge from "./edge"; import * as firefox from "./firefox"; import * as http from "./http"; import * as ie from "./ie"; import { By, ByHash, RelativeBy } from "./lib/by"; import { Browser, Capabilities, ITimeouts } from "./lib/capabilities"; import * as command from "./lib/command"; import { Actions, Key } from "./lib/input"; import * as logging from "./lib/logging"; import { promise } from "./lib/promise"; import * as until from "./lib/until"; import { ShadowRootPromise } from "./lib/webdriver"; import * as safari from "./safari"; export * from "./lib/by"; export { Browser, Capabilities, Capability, ITimeouts } from "./lib/capabilities"; export { Actions, Button, Key, Origin } from "./lib/input"; export { promise } from "./lib/promise"; export { LogInspector }; export { until }; export { logging }; /** * Typings for lib/error */ export namespace error { class IError extends Error { constructor(message?: string); message: string; } /** * The base WebDriver error type. This error type is only used directly when a * more appropriate category is not defined for the offending error. */ class WebDriverError extends IError { constructor(message?: string); remoteStacktrace?: string | undefined; } /** * Indicates a {@linkplain ./webdriver.WebElement#click click command} could * not completed because the click target is obscured by other elements on the * page. */ class ElementClickInterceptedError extends WebDriverError { constructor(message?: string); } /** * An attempt was made to select an element that cannot be selected. */ class ElementNotSelectableError extends WebDriverError { constructor(message?: string); } /** * Indicates a command could not be completed because the target element is * not pointer or keyboard interactable. This will often occur if an element * is present in the DOM, but not rendered (i.e. its CSS style has * "display: none"). */ class ElementNotInteractableError extends WebDriverError { constructor(message?: string); } /** * Indicates a navigation event caused the browser to generate a certificate * warning. This is usually caused by an expired or invalid TLS certificate. */ class InsecureCertificateError extends WebDriverError { constructor(message?: string); } /** * The arguments passed to a command are either invalid or malformed. */ class InvalidArgumentError extends WebDriverError { constructor(message?: string); } /** * An illegal attempt was made to set a cookie under a different domain than * the current page. */ class InvalidCookieDomainError extends WebDriverError { constructor(message?: string); } /** * The coordinates provided to an interactions operation are invalid. */ class InvalidCoordinatesError extends WebDriverError { constructor(message?: string); } /** * An element command could not be completed because the element is in an * invalid state, e.g. attempting to click an element that is no longer * attached to the document. */ class InvalidElementStateError extends WebDriverError { constructor(message?: string); } /** * Argument was an invalid selector. */ class InvalidSelectorError extends WebDriverError { constructor(message?: string); } /** * Occurs when a command is directed to a session that does not exist. */ class NoSuchSessionError extends WebDriverError { constructor(message?: string); } /** * An error occurred while executing JavaScript supplied by the user. */ class JavascriptError extends WebDriverError { constructor(message?: string); } /** * The target for mouse interaction is not in the browser’s viewport and * cannot be brought into that viewport. */ class MoveTargetOutOfBoundsError extends WebDriverError { constructor(message?: string); } /** * An attempt was made to operate on a modal dialog when one was not open. */ class NoSuchAlertError extends WebDriverError { constructor(message?: string); } /** * Indicates a named cookie could not be found in the cookie jar for the * currently selected document. */ class NoSuchCookieError extends WebDriverError { constructor(message?: string); } /** * An element could not be located on the page using the given search * parameters. */ class NoSuchElementError extends WebDriverError { constructor(message?: string); } /** * A request to switch to a frame could not be satisfied because the frame * could not be found. */ class NoSuchFrameError extends WebDriverError { constructor(message?: string); } /** * A request to switch to a window could not be satisfied because the window * could not be found. */ class NoSuchWindowError extends WebDriverError { constructor(message?: string); } /** * A script did not complete before its timeout expired. */ class ScriptTimeoutError extends WebDriverError { constructor(message?: string); } /** * A new session could not be created. */ class SessionNotCreatedError extends WebDriverError { constructor(message?: string); } /** * An element command failed because the referenced element is no longer * attached to the DOM. */ class StaleElementReferenceError extends WebDriverError { constructor(message?: string); } /** * An operation did not completErrorCodee before its timeout expired. */ class TimeoutError extends WebDriverError { constructor(message?: string); } /** * A request to set a cookie’s value could not be satisfied. */ class UnableToSetCookieError extends WebDriverError { constructor(message?: string); } /** * A screen capture operation was not possible. */ class UnableToCaptureScreenError extends WebDriverError { constructor(message?: string); } /** * A modal dialog was open, blocking this operation. */ class UnexpectedAlertOpenError extends WebDriverError { constructor(message?: string, openAlertText?: string); /** * @return {(string|undefined)} The text displayed with the unhandled alert, * if available. */ getAlertText(): string; } /** * A command could not be executed because the remote end is not aware of it. */ class UnknownCommandError extends WebDriverError { constructor(message?: string); } /** * The requested command matched a known URL but did not match an method for * that URL. */ class UnknownMethodError extends WebDriverError { constructor(message?: string); } /** * Reports an unsupport operation. */ class UnsupportedOperationError extends WebDriverError { constructor(message?: string); } interface Response { error: string | number; message: string; } /** * Checks a response object from a server that adheres to the W3C WebDriver * protocol. */ function checkResponse(data: Response): Response; interface MaybeLegacyResponse { status?: number | undefined; value?: { message: string } | undefined; message?: string | undefined; getAlertText?(): string; } /** * Checks a legacy response from the Selenium 2.0 wire protocol for an error. */ function checkLegacyResponse(response: MaybeLegacyResponse): MaybeLegacyResponse; interface ErrorData { error: string | number; message: string; [key: string]: string | number; } /** * Throws an error coded from the W3C protocol. A generic error will be thrown * if the provided `data` is not a valid encoded error. */ function throwDecodedError(data: ErrorData | string): never; interface ErrorCodeType { [key: string]: number; } const ErrorCode: ErrorCodeType; /** * Lookup the err in table of errors. */ function encodeError(err: any): { error: string; message: string }; } type ConditionFn<T> = (webdriver: WebDriver) => T | null | Promise<T | null>; /** * Defines a condition for use with WebDriver's WebDriver#wait wait command. */ export class Condition<T> { /** * @param {string} message A descriptive error message. Should complete the * sentence 'Waiting [...]' * @param {function(!WebDriver): OUT} fn The condition function to * evaluate on each iteration of the wait loop. */ constructor(message: string, fn: ConditionFn<T>); /** @return {string} A description of this condition. */ description(): string; fn(webdriver: WebDriver): ConditionFn<T>; } /** * Defines a condition that will result in a {@link WebElement}. */ export class WebElementCondition extends Condition<WebElement> { // add an unused private member so the compiler treats this // class distinct from other Conditions private _nominal: undefined; } /** * x,y */ export interface ILocation { x: number; y: number; } /** * width, height */ export interface ISize { width: number; height: number; } /** * x,y,w,h */ export interface IRectangle { x: number; y: number; width: number; height: number; } /** * Class for defining sequences of user touch interactions. Each sequence * will not be executed until {@link #perform} is called. * * Example: * * new TouchSequence(driver). * tapAndHold({x: 0, y: 0}). * move({x: 3, y: 4}). * release({x: 10, y: 10}). * perform(); */ export class TouchSequence { /* * @param {!WebDriver} driver The driver instance to use. * @constructor */ constructor(driver: WebDriver); /** * Executes this action sequence. * @return {!Promise} A promise that will be resolved once * this sequence has completed. */ perform(): Promise<void>; /** * Taps an element. * * @param {!WebElement} elem The element to tap. * @return {!TouchSequence} A self reference. */ tap(elem: WebElement): TouchSequence; /** * Double taps an element. * * @param {!WebElement} elem The element to double tap. * @return {!TouchSequence} A self reference. */ doubleTap(elem: WebElement): TouchSequence; /** * Long press on an element. * * @param {!WebElement} elem The element to long press. * @return {!TouchSequence} A self reference. */ longPress(elem: WebElement): TouchSequence; /** * Touch down at the given location. * * @param {{ x: number, y: number }} location The location to touch down at. * @return {!TouchSequence} A self reference. */ tapAndHold(location: ILocation): TouchSequence; /** * Move a held {@linkplain #tapAndHold touch} to the specified location. * * @param {{x: number, y: number}} location The location to move to. * @return {!TouchSequence} A self reference. */ move(location: ILocation): TouchSequence; /** * Release a held {@linkplain #tapAndHold touch} at the specified location. * * @param {{x: number, y: number}} location The location to release at. * @return {!TouchSequence} A self reference. */ release(location: ILocation): TouchSequence; /** * Scrolls the touch screen by the given offset. * * @param {{x: number, y: number}} offset The offset to scroll to. * @return {!TouchSequence} A self reference. */ scroll(offset: IOffset): TouchSequence; /** * Scrolls the touch screen, starting on `elem` and moving by the specified * offset. * * @param {!WebElement} elem The element where scroll starts. * @param {{x: number, y: number}} offset The offset to scroll to. * @return {!TouchSequence} A self reference. */ scrollFromElement(elem: WebElement, offset: IOffset): TouchSequence; /** * Flick, starting anywhere on the screen, at speed xspeed and yspeed. * * @param {{xspeed: number, yspeed: number}} speed The speed to flick in each * direction, in pixels per second. * @return {!TouchSequence} A self reference. */ flick(speed: ISpeed): TouchSequence; /** * Flick starting at elem and moving by x and y at specified speed. * * @param {!WebElement} elem The element where flick starts. * @param {{x: number, y: number}} offset The offset to flick to. * @param {number} speed The speed to flick at in pixels per second. * @return {!TouchSequence} A self reference. */ flickElement(elem: WebElement, offset: IOffset, speed: number): TouchSequence; } /** * x.y again */ export interface IOffset { x: number; y: number; } /** * delta x,y */ export interface ISpeed { xspeed: number; yspeed: number; } /** * Represents a modal dialog such as {@code alert}, {@code confirm}, or * {@code prompt}. Provides functions to retrieve the message displayed with * the alert, accept or dismiss the alert, and set the response text (in the * case of {@code prompt}). */ export class Alert { /** * @param {!WebDriver} driver The driver controlling the browser this alert * is attached to. * @param {string} text The message text displayed with this alert. */ constructor(driver: WebDriver, text: string); // region Methods /** * Retrieves the message text displayed with this alert. For instance, if the * alert were opened with alert('hello'), then this would return 'hello'. * @return {!Promise} A promise that will be resolved to the * text displayed with this alert. */ getText(): Promise<string>; /** * Sets the username and password in an alert prompting for credentials (such * as a Basic HTTP Auth prompt). This method will implicitly * {@linkplain #accept() submit} the dialog. * * @param {string} username The username to send. * @param {string} password The password to send. * @return {!Promise<void>} A promise that will be resolved when this * command has completed. */ authenticateAs(username: string, password: string): Promise<void>; /** * Accepts this alert. * @return {!Promise} A promise that will be resolved when * this command has completed. */ accept(): Promise<void>; /** * Dismisses this alert. * @return {!Promise} A promise that will be resolved when * this command has completed. */ dismiss(): Promise<void>; /** * Sets the response text on this alert. This command will return an error if * the underlying alert does not support response text (e.g. window.alert and * window.confirm). * @param {string} text The text to set. * @return {!Promise} A promise that will be resolved when * this command has completed. */ sendKeys(text: string): Promise<void>; // endregion } /** * AlertPromise is a promise that will be fulfilled with an Alert. This promise * serves as a forward proxy on an Alert, allowing calls to be scheduled * directly on this instance before the underlying Alert has been fulfilled. In * other words, the following two statements are equivalent: * * driver.switchTo().alert().dismiss(); * driver.switchTo().alert().then(function(alert) { * return alert.dismiss(); * }); * * @final */ export interface AlertPromise extends Promise<Alert> {} /** * Implement AlertPromise */ export class AlertPromise extends Alert { /** * @param {!WebDriver} driver The driver controlling the browser this * alert is attached to. * @param {!promise.Thenable<!Alert>} alert A thenable * that will be fulfilled with the promised alert. */ constructor(driver: WebDriver, alert: Promise<Alert>); } /** * ProxyConfig */ export interface ProxyConfig { proxyType: string; proxyAutoconfigUrl?: string | undefined; ftpProxy?: string | undefined; httpProxy?: string | undefined; sslProxy?: string | undefined; noProxy?: string | undefined; socksProxy?: string | undefined; socksUsername?: string | undefined; socksPassword?: string | undefined; } /** * Creates new {@link WebDriver WebDriver} instances. The environment * variables listed below may be used to override a builder's configuration, * allowing quick runtime changes. * * - {@code SELENIUM_BROWSER}: defines the target browser in the form * {@code browser[:version][:platform]}. * * - {@code SELENIUM_REMOTE_URL}: defines the remote URL for all builder * instances. This environment variable should be set to a fully qualified * URL for a WebDriver server (e.g. http://localhost:4444/wd/hub). This * option always takes precedence over {@code SELENIUM_SERVER_JAR}. * * - {@code SELENIUM_SERVER_JAR}: defines the path to the * <a href='http://selenium-release.storage.googleapis.com/index.html'> * standalone Selenium server</a> jar to use. The server will be started the * first time a WebDriver instance and be killed when the process exits. * * Suppose you had mytest.js that created WebDriver with * * var driver = new Builder() * .forBrowser('chrome') * .build(); * * This test could be made to use Firefox on the local machine by running with * `SELENIUM_BROWSER=firefox node mytest.js`. Rather than change the code to * target Google Chrome on a remote machine, you can simply set the * `SELENIUM_BROWSER` and `SELENIUM_REMOTE_URL` environment variables: * * SELENIUM_BROWSER=chrome:36:LINUX \ * SELENIUM_REMOTE_URL=http://www.example.com:4444/wd/hub \ * node mytest.js * * You could also use a local copy of the standalone Selenium server: * * SELENIUM_BROWSER=chrome:36:LINUX \ * SELENIUM_SERVER_JAR=/path/to/selenium-server-standalone.jar \ * node mytest.js */ export class Builder { // region Constructors /** */ constructor(); // endregion // region Methods /** * Configures this builder to ignore any environment variable overrides and to * only use the configuration specified through this instance's API. * * @return {!Builder} A self reference. */ disableEnvironmentOverrides(): Builder; /** * Creates a new WebDriver client based on this builder's current * configuration. * * This method will return a {@linkplain ThenableWebDriver} instance, allowing * users to issue commands directly without calling `then()`. The returned * thenable wraps a promise that will resolve to a concrete * {@linkplain webdriver.WebDriver WebDriver} instance. The promise will be * rejected if the remote end fails to create a new session. * * @return {!ThenableWebDriver} A new WebDriver instance. * @throws {Error} If the current configuration is invalid. */ build(): ThenableWebDriver; /** * Configures the target browser for clients created by this instance. * Any calls to {@link #withCapabilities} after this function will * overwrite these settings. * * <p>You may also define the target browser using the {@code * SELENIUM_BROWSER} environment variable. If set, this environment variable * should be of the form {@code browser[:[version][:platform]]}. * * @param {(string|Browser)} name The name of the target browser; * common defaults are available on the {@link Browser} enum. * @param {string=} opt_version A desired version; may be omitted if any * version should be used. * @param {string=} opt_platform The desired platform; may be omitted if any * version may be used. * @return {!Builder} A self reference. */ forBrowser(name: string, opt_version?: string, opt_platform?: string): Builder; /** * Returns the base set of capabilities this instance is currently configured * to use. * @return {!Capabilities} The current capabilities for this builder. */ getCapabilities(): Capabilities; /** * @return {string} The URL of the WebDriver server this instance is * configured to use. */ getServerUrl(): string; /** * @return {?string} The URL of the proxy server to use for the WebDriver's * HTTP connections, or `null` if not set. */ getWebDriverProxy(): string | null; /** * Sets the default action to take with an unexpected alert before returning * an error. * @param {string} beahvior The desired behavior; should be 'accept', * 'dismiss', or 'ignore'. Defaults to 'dismiss'. * @return {!Builder} A self reference. */ setAlertBehavior(behavior?: string): Builder; /** * Sets Chrome-specific options for drivers created by this builder. Any * logging or proxy settings defined on the given options will take precedence * over those set through {@link #setLoggingPrefs} and {@link #setProxy}, * respectively. * * @param {!chrome.Options} options The ChromeDriver options to use. * @return {!Builder} A self reference. */ setChromeOptions(options: chrome.Options): Builder; /** * @return {chrome.Options} the Chrome specific options currently configured * for this builder. */ getChromeOptions(): chrome.Options; /** * Sets the service builder to use for managing the chromedriver child process * when creating new Chrome sessions. * * @param {chrome.ServiceBuilder} service the service to use. * @return {!Builder} A self reference. */ setChromeService(service: chrome.ServiceBuilder): Builder; /** * Set {@linkplain edge.Options options} specific to Microsoft's Edge browser * for drivers created by this builder. Any proxy settings defined on the * given options will take precedence over those set through * {@link #setProxy}. * * @param {!edge.Options} options The MicrosoftEdgeDriver options to use. * @return {!Builder} A self reference. */ setEdgeOptions(options: edge.Options): Builder; /** * Sets the {@link edge.ServiceBuilder} to use to manage the * MicrosoftEdgeDriver child process when creating sessions locally. * * @param {edge.ServiceBuilder} service the service to use. * @return {!Builder} a self reference. */ setEdgeService(service: edge.ServiceBuilder): Builder; /** * Sets Firefox-specific options for drivers created by this builder. Any * logging or proxy settings defined on the given options will take precedence * over those set through {@link #setLoggingPrefs} and {@link #setProxy}, * respectively. * * @param {!firefox.Options} options The FirefoxDriver options to use. * @return {!Builder} A self reference. */ setFirefoxOptions(options: firefox.Options): Builder; /** * @return {firefox.Options} the Firefox specific options currently configured * for this instance. */ getFirefoxOptions(): firefox.Options; /** * Sets the {@link firefox.ServiceBuilder} to use to manage the geckodriver * child process when creating Firefox sessions locally. * * @param {firefox.ServiceBuilder} service the service to use. * @return {!Builder} a self reference. */ setFirefoxService(service: firefox.ServiceBuilder): Builder; /** * Set Internet Explorer specific {@linkplain ie.Options options} for drivers * created by this builder. Any proxy settings defined on the given options * will take precedence over those set through {@link #setProxy}. * * @param {!ie.Options} options The IEDriver options to use. * @return {!Builder} A self reference. */ setIeOptions(options: ie.Options): Builder; /** * Sets the {@link ie.ServiceBuilder} to use to manage the geckodriver * child process when creating IE sessions locally. * * @param {ie.ServiceBuilder} service the service to use. * @return {!Builder} a self reference. */ setIeService(service: ie.ServiceBuilder): Builder; /** * Sets the logging preferences for the created session. Preferences may be * changed by repeated calls, or by calling {@link #withCapabilities}. * @param {!(logging.Preferences|Object.<string, string>)} prefs The * desired logging preferences. * @return {!Builder} A self reference. */ setLoggingPrefs(prefs: logging.Preferences | {}): Builder; /** * Sets the proxy configuration to use for WebDriver clients created by this * builder. Any calls to {@link #withCapabilities} after this function will * overwrite these settings. * @param {!capabilities.ProxyConfig} config The configuration to use. * @return {!Builder} A self reference. */ setProxy(config: ProxyConfig): Builder; /** * Sets Safari specific {@linkplain safari.Options options} for drivers * created by this builder. Any logging settings defined on the given options * will take precedence over those set through {@link #setLoggingPrefs}. * * @param {!safari.Options} options The Safari options to use. * @return {!Builder} A self reference. */ setSafariOptions(options: safari.Options): Builder; /** * @return {safari.Options} the Safari specific options currently configured * for this instance. */ getSafariOptions(): safari.Options; /** * Sets the http agent to use for each request. * If this method is not called, the Builder will use http.globalAgent by * default. * * @param {http.Agent} agent The agent to use for each request. * @return {!Builder} A self reference. */ usingHttpAgent(agent: any): Builder; /** * @return {http.Agent} The http agent used for each request */ getHttpAgent(): any | null; /** * Sets the URL of a remote WebDriver server to use. Once a remote URL has * been specified, the builder direct all new clients to that server. If this * method is never called, the Builder will attempt to create all clients * locally. * * <p>As an alternative to this method, you may also set the * {@code SELENIUM_REMOTE_URL} environment variable. * * @param {string} url The URL of a remote server to use. * @return {!Builder} A self reference. */ usingServer(url: string): Builder; /** * Sets the URL of the proxy to use for the WebDriver's HTTP connections. * If this method is never called, the Builder will create a connection * without a proxy. * * @param {string} proxy The URL of a proxy to use. * @return {!Builder} A self reference. */ usingWebDriverProxy(proxy: string): Builder; /** * Sets the desired capabilities when requesting a new session. This will * overwrite any previously set capabilities. * @param {!(Object|Capabilities)} capabilities The desired * capabilities for a new session. * @return {!Builder} A self reference. */ withCapabilities(capabilities: {} | Capabilities): Builder; // endregion } export type Locator = By | Function | ByHash | RelativeBy; /** * Describes an event listener registered on an {@linkplain EventEmitter}. */ export class Listener { /** * @param {!Function} fn The acutal listener function. * @param {(Object|undefined)} scope The object in whose scope to invoke the * listener. * @param {boolean} oneshot Whether this listener should only be used once. */ constructor(fn: Function, scope: {}, oneshot: boolean); } /** * Object that can emit events for others to listen for. This is used instead * of Closure's event system because it is much more light weight. The API is * based on Node's EventEmitters. */ export class EventEmitter { // region Constructors /** */ constructor(); // endregion // region Methods /** * Fires an event and calls all listeners. * @param {string} type The type of event to emit. * @param {...*} var_args Any arguments to pass to each listener. */ emit(type: string, ...var_args: any[]): void; /** * Returns a mutable list of listeners for a specific type of event. * @param {string} type The type of event to retrieve the listeners for. * @return {!Set<!Listener>} The registered listeners for the given event * type. */ listeners(type: string): any; /** * Registers a listener. * @param {string} type The type of event to listen for. * @param {!Function} fn The function to invoke when the event is fired. * @param {Object=} opt_self The object in whose scope to invoke the listener. * @param {boolean=} opt_oneshot Whether the listener should b (e removed * after * the first event is fired. * @return {!EventEmitter} A self reference. */ addListener(type: string, fn: Function, opt_scope?: any, opt_oneshot?: boolean): EventEmitter; /** * Registers a one-time listener which will be called only the first time an * event is emitted, after which it will be removed. * @param {string} type The type of event to listen for. * @param {!Function} fn The function to invoke when the event is fired. * @param {Object=} opt_scope The object in whose scope to invoke the * listener. * @return {!EventEmitter} A self reference. */ once(type: string, fn: any, opt_scope?: any): EventEmitter; /** * An alias for {@code #addListener()}. * @param {string} type The type of event to listen for. * @param {!Function} fn The function to invoke when the event is fired. * @param {Object=} opt_scope The object in whose scope to invoke the * listener. * @return {!EventEmitter} A self reference. */ on(type: string, fn: Function, opt_scope?: any): EventEmitter; /** * Removes a previously registered event listener. * @param {string} type The type of event to unregister. * @param {!Function} listenerFn The handler function to remove. * @return {!EventEmitter} A self reference. */ removeListener(type: string, listenerFn: Function): EventEmitter; /** * Removes all listeners for a specific type of event. If no event is * specified, all listeners across all types will be removed. * @param {string=} opt_type The type of event to remove listeners from. * @return {!EventEmitter} A self reference. */ removeAllListeners(opt_type?: string): EventEmitter; // endregion } /** * Interface for navigating back and forth in the browser history. */ export class Navigation { // region Constructors /** * Interface for navigating back and forth in the browser history. * * This class should never be instantiated directly. Insead, obtain an * instance with * * navigate() * * @see WebDriver#navigate() */ constructor(driver: WebDriver); // endregion // region Methods /** * Schedules a command to navigate to a new URL. * @param {string} url The URL to navigate to. * @return {!Promise.<void>} A promise that will be resolved * when the URL has been loaded. */ to(url: string): Promise<void>; /** * Schedules a command to move backwards in the browser history. * @return {!Promise.<void>} A promise that will be resolved * when the navigation event has completed. */ back(): Promise<void>; /** * Schedules a command to move forwards in the browser history. * @return {!Promise.<void>} A promise that will be resolved * when the navigation event has completed. */ forward(): Promise<void>; /** * Schedules a command to refresh the current page. * @return {!Promise.<void>} A promise that will be resolved * when the navigation event has completed. */ refresh(): Promise<void>; // endregion } export interface IWebDriverOptionsCookie { /** * The name of the cookie. */ name: string; /** * The cookie value. */ value: string; /** * The cookie path. Defaults to "/" when adding a cookie. */ path?: string | undefined; /** * The domain the cookie is visible to. Defaults to the current browsing * context's document's URL when adding a cookie. */ domain?: string | undefined; /** * Whether the cookie is a secure cookie. Defaults to false when adding a new * cookie. */ secure?: boolean | undefined; /** * Whether the cookie is an HTTP only cookie. Defaults to false when adding a * new cookie. */ httpOnly?: boolean | undefined; /** * When the cookie expires. * * When {@linkplain Options#addCookie() adding a cookie}, this may be * specified in _seconds_ since Unix epoch (January 1, 1970). The expiry will * default to 20 years in the future if omitted. * * The expiry is always returned in seconds since epoch when * {@linkplain Options#getCookies() retrieving cookies} from the browser. */ expiry?: number | Date | undefined; } export interface IWebDriverCookie extends IWebDriverOptionsCookie { /** * When the cookie expires. * * The expiry is always returned in seconds since epoch when * {@linkplain Options#getCookies() retrieving cookies} from the browser. */ expiry?: number | undefined; } /** * Provides methods for managing browser and driver state. */ export class Options { // region Constructors /** * @param {!WebDriver} driver The parent driver. */ constructor(driver: WebDriver); // endregion // region Methods /** * Schedules a command to add a cookie. * @param {IWebDriverOptionsCookie} spec Defines the cookie to add. * @return {!Promise<void>} A promise that will be resolved * when the cookie has been added to the page. * @throws {error.InvalidArgumentError} if any of the cookie parameters are * invalid. * @throws {TypeError} if `spec` is not a cookie object. */ addCookie(spec: IWebDriverOptionsCookie): Promise<void>; /** * Schedules a command to delete all cookies visible to the current page. * @return {!Promise} A promise that will be resolved when all * cookies have been deleted. */ deleteAllCookies(): Promise<void>; /** * Schedules a command to delete the cookie with the given name. This command * is a no-op if there is no cookie with the given name visible to the current * page. * @param {string} name The name of the cookie to delete. * @return {!Promise} A promise that will be resolved when the * cookie has been deleted. */ deleteCookie(name: string): Promise<void>; /** * Schedules a command to retrieve all cookies visible to the current page. * Each cookie will be returned as a JSON object as described by the WebDriver * wire protocol. * @return {!Promise} A promise that will be resolved with the * cookies visible to the current page. * @see http://code.google.com/p/selenium/wiki/JsonWireProtocol#Cookie_JSON_Object */ getCookies(): Promise<IWebDriverCookie[]>; /** * Schedules a command to retrieve the cookie with the given name. Returns * null if there is no such cookie. The cookie will be returned as a JSON * object as described by the WebDriver wire protocol. * @param {string} name The name of the cookie to retrieve. * @return {!Promise} A promise that will be resolved with the * named cookie, or {@code null} if there is no such cookie. * @see http://code.google.com/p/selenium/wiki/JsonWireProtocol#Cookie_JSON_Object */ getCookie(name: string): Promise<IWebDriverCookie>; /** * @return {!Logs} The interface for managing driver * logs. */ logs(): Logs; /** * The current timeouts */ getTimeouts(): Promise<ITimeouts>; /** * Set current timeouts */ setTimeouts(timeouts: ITimeouts): Promise<void>; /** * @return {!Window} The interface for managing the * current window. */ window(): Window; // endregion } /** * An interface for managing the current window. */ export class Window { // region Constructors /** * @param {!WebDriver} driver The parent driver. */ constructor(driver: WebDriver); // endregion // region Methods /** * Retrieves the window's current position, relative to the top left corner of * the screen. * @return {!Promise} A promise that will be resolved with the * window's position in the form of a {x:number, y:number} object literal. */ getPosition(): Promise<ILocation>; /** * Repositions the current window. * @param {number} x The desired horizontal position, relative to the left * side of the screen. * @param {number} y The desired vertical position, relative to the top of the * of the screen. * @return {!Promise} A promise that will be resolved when the * command has completed. */ setPosition(x: number, y: number): Promise<void>; /** * Retrieves the window's current size. * @return {!Promise} A promise that will be resolved with the * window's size in the form of a {width:number, height:number} object * literal. */ getSize(): Promise<ISize>; /** * Resizes the current window. * @param {number} width The desired window width. * @param {number} height The desired window height. * @return {!Promise} A promise that will be resolved when the * command has completed. */ setSize(width: number, height: number): Promise<void>; /** * Returns the current top-level window's size and position. */ getRect(): Promise<IRectangle>; /** * Sets the current top-level window's size and position. You may update * just the size by omitting `x` & `y`, or just the position by omitting * `width` & `height` options. */ setRect({ x, y, width, height }: Partial<IRectangle>): Promise<IRectangle>; /** * Maximizes the current window. The exact behavior of this command is * specific to individual window managers, but typically involves increasing * the window to the maximum available size without going full-screen. * @return {!Promise} A promise that will be resolved when the * command has completed. */ maximize(): Promise<void>; /** * Minimizes the current window. The exact behavior of this command is * specific to individual window managers, but typically involves hiding * the window in the system tray. * @return {!Promise} A promise that will be resolved when the * command has completed. */ minimize(): Promise<void>; /** * Invokes the "full screen" operation on the current window. The exact * behavior of this command is specific to individual window managers, but * this will typically increase the window size to the size of the physical * display and hide the browser chrome. * * @return {!Promise<void>} A promise that will be resolved when the command * has completed. * @see <https://fullscreen.spec.whatwg.org/#fullscreen-an-element> */ fullscreen(): Promise<void>; // endregion } /** * Interface for managing WebDriver log records. */ export class Logs { // region Constructors /** * @param {!WebDriver} driver The parent driver. */ constructor(driver: WebDriver); // endregion // region /** * Fetches available log entries for the given type. * * <p/>Note that log buffers are reset after each call, meaning that * available log entries correspond to those entries not yet returned for a * given log type. In practice, this means that this call will return the * available log entries since the last call, or from the start of the * session. * * @param {!logging.Type} type The desired log type. * @return {!Promise.<!Array.<!logging.Entry>>} A * promise that will resolve to a list of log entries for the specified * type. */ get(type: string): Promise<logging.Entry[]>; /** * Retrieves the log types available to this driver. * @return {!Promise.<!Array.<!logging.Type>>} A * promise that will resolve to a list of available log types. */ getAvailableLogTypes(): Promise<string[]>; // endregion } /** * An interface for changing the focus of the driver to another frame or window. */ export class TargetLocator { // region Constructors /** * @param {!WebDriver} driver The parent driver. */ constructor(driver: WebDriver); // endregion // region Methods /** * Schedules a command retrieve the {@code document.activeElement} element on * the current document, or {@code document.body} if activeElement is not * available. * @return {!WebElement} The active element. */ activeElement(): WebElementPromise; /** * Schedules a command to switch focus of all future commands to the first * frame on the page. * @return {!Promise} A promise that will be resolved when the * driver has changed focus to the default content. */ defaultContent(): Promise<void>; /** * Changes the focus of all future commands to another frame on the page. The * target frame may be specified as one of the following: * * - A number that specifies a (zero-based) index into [window.frames]( * https://developer.mozilla.org/en-US/docs/Web/API/Window.frames). * - A {@link WebElement} reference, which correspond to a `frame` or `iframe` * DOM element. * - The `null` value, to select the topmost frame on the page. Passing `null` * is the same as calling {@link #defaultContent defaultContent()}. * * If the specified frame can not be found, the returned promise will be * rejected with a {@linkplain error.NoSuchFrameError}. * * @param {(number|WebElement|null)} id The frame locator. * @return {!Promise<void>} A promise that will be resolved * when the driver has changed focus to the specified frame. */ frame(id: number | WebElement | null): Promise<void>; /** * Changes the focus of all future commands to the parent frame of the * currently selected frame. This command has no effect if the driver is * already focused on the top-level browsing context. * * @return {!Promise<void>} A promise that will be resolved when the command * has completed. */ parentFrame(): Promise<void>; /** * Schedules a command to switch the focus of all future commands to another * window. Windows may be specified by their {@code window.name} attribute or * by its handle (as returned by {@link WebDriver#getWindowHandles}). * * If the specified window cannot be found, the returned promise will be * rejected with a {@linkplain error.NoSuchWindowError}. * * @param {string} nameOrHandle The name or window handle of the window to * switch focus to. * @return {!Promise<void>} A promise that will be resolved * when the driver has changed focus to the specified window. */ window(nameOrHandle: string): Promise<void>; /** * Creates a new browser window and switches the focus for future * commands of this driver to the new window. * * @param {string} typeHint 'window' or 'tab'. The created window is not * guaranteed to be of the requested type; if the driver does not support * the requested type, a new browser window will be created of whatever type * the driver does support. * @return {!Promise<void>} A promise that will be resolved * when the driver has changed focus to the new window. */ newWindow(typeHint: string): Promise<void>; /** * Schedules a command to change focus to the active modal dialog, such as * those opened by `window.alert()`, `window.confirm()`, and * `window.prompt()`. The returned promise will be rejected with a * {@linkplain error.NoSuchAlertError} if there are no open alerts. * * @return {!AlertPromise} The open alert. */ alert(): AlertPromise; // endregion } /** * Used with {@link WebElement#sendKeys WebElement#sendKeys} on file * input elements ({@code <input type='file'>}) to detect when the entered key * sequence defines the path to a file. * * By default, {@linkplain WebElement WebElement's} will enter all * key sequences exactly as entered. You may set a * {@linkplain WebDriver#setFileDetector file detector} on the parent * WebDriver instance to define custom behavior for handling file elements. Of * particular note is the {@link selenium-webdriver/remote.FileDetector}, which * should be used when running against a remote * [Selenium Server](http://docs.seleniumhq.org/download/). */ export class FileDetector { constructor(); /** * Handles the file specified by the given path, preparing it for use with * the current browser. If the path does not refer to a valid file, it will * be returned unchanged, otherwisee a path suitable for use with the current * browser will be returned. * * This default implementation is a no-op. Subtypes may override this * function for custom tailored file handling. * * @param {!WebDriver} driver The driver for the current browser. * @param {string} path The path to process. * @return {!Promise<string>} A promise for the processed * file path. * @package */ handleFile(driver: WebDriver, path: string): Promise<string>; } export type CreateSessionCapabilities = Capabilities | { desired?: Capabilities | undefined; required?: Capabilities | undefined; }; /** * Creates a new WebDriver client, which provides control over a browser. * * Every WebDriver command returns a {@code Promise} that * represents the result of that command. Callbacks may be registered on this * object to manipulate the command result or catch an expected error. Any * commands scheduled with a callback are considered sub-commands and will * execute before the next command in the current frame. For example: * * var message = []; * driver.call(message.push, message, 'a').then(function() { * driver.call(message.push, message, 'b'); * }); * driver.call(message.push, message, 'c'); * driver.call(function() { * alert('message is abc? ' + (message.join('') == 'abc')); * }); */ export class WebDriver { // region Constructors /** * @param {!(Session|Promise<!Session>)} session Either a * known session or a promise that will be resolved to a session. * @param {!command.Executor} executor The executor to use when sending * commands to the browser. */ constructor(session: Session | Promise<Session>, executor: http.Executor); // endregion // region StaticMethods /** * Creates a new WebDriver session. * * By default, the requested session `capabilities` are merely "desired" and * the remote end will still create a new session even if it cannot satisfy * all of the requested capabilities. You can query which capabilities a * session actually has using the * {@linkplain #getCapabilities() getCapabilities()} method on the returned * WebDriver instance. * * To define _required capabilities_, provide the `capabilities` as an object * literal with `required` and `desired` keys. The `desired` key may be * omitted if all capabilities are required, and vice versa. If the server * cannot create a session with all of the required capabilities, it will * return an {@linkplain error.SessionNotCreatedError}. * * let required = new Capabilities().set('browserName', 'firefox'); * let desired = new Capabilities().set('version', '45'); * let driver = WebDriver.createSession(executor, {required, desired}); * * This function will always return a WebDriver instance. If there is an error * creating the session, such as the aforementioned SessionNotCreatedError, * the driver will have a rejected {@linkplain #getSession session} promise. * It is recommended that this promise is left _unhandled_ so it will * propagate through the {@linkplain promise.ControlFlow control flow} and * cause subsequent commands to fail. * * let required = Capabilities.firefox(); * let driver = WebDriver.createSession(execut