Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
WebDriver is a remote control interface that enables introspection and control of user agents. It provides a platform- and language-neutral wire protocol as a way for out-of-process programs to remotely instruct the behavior of web browsers.
Provided is a set of interfaces to discover and manipulate DOM elements in web documents and to control the behavior of a user agent. It is primarily intended to allow web authors to write tests that automate a user agent from a separate controlling process, but may also be used in such a way as to allow in-browser scripts to control a — possibly separate — browser.
This section describes the status of this document at the time of its publication. A list of current W3C publications and the latest revision of this technical report can be found in the W3C standards and drafts index.
This document was published by the Browser Testing and Tools Working Group as an Editor's Draft.
Publication as an Editor's Draft does not imply endorsement by W3C and its Members.
This is a draft document and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to cite this document as other than a work in progress.
This document was produced by a group operating under the W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent that the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.
This document is governed by the 18 August 2025 W3C Process Document.
This section is non-normative.
The WebDriver standard attempts to follow a number of design goals:
This specification is derived from the popular Selenium WebDriver browser automation framework. Selenium is a long-lived project, and due to its age and breadth of use it has a wide range of expected functionality. This specification uses these expectations to inform its design. Where improvements or clarifications have been made, they have been made with care to allow existing users of Selenium WebDriver to avoid unexpected breakages.
The largest intended group of users of this specification are software developers and testers writing automated tests and other tooling, such as monitoring or load testing, that relies on automating a browser. As such, care has been taken to provide commands that simplify common tasks such as typing into and clicking elements.
WebDriver provides a mechanism for others to define extensions to the protocol for the purposes of automating functionality that cannot be implemented entirely in ECMAScript. This allows other web standards to support the automation of new platform features. It also allows vendors to expose functionality that is specific to their browser.
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
Conformance requirements phrased as algorithms or specific steps may be implemented in any manner, so long as the end result is equivalent. Algorithms in this document are typically written with readability, rather than performance, in mind.
In equations, all numbers are integers, addition is represented by “+”, subtraction by “−”, division by “÷”, and bitwise OR by “|”. The characters “(” and “)” are used to provide logical grouping in these contexts.
The mathematical function min(value, value[, value]) returns the smallest item of two or more values. Conversely, the function max(value, value[, value]) returns the largest item of two or more values.
The mathematical function floor(value) produces the largest integer, closest to positive infinity, that is not larger than value.
A Universally Unique Identifier (UUID) is a 128 bits long URN that requires no central registration process. Generating a UUID means Creating a UUID From Truly Random or Pseudo-Random Numbers, and converting it to the string representation. [RFC4122]
The Unix Epoch is a value that approximates the number of seconds that have elapsed since the Epoch, as described by The Open Group Base Specifications Issue 7 section 4.15 (IEEE Std 1003.1).
An integer is a Number that is unchanged under the ToInteger operation.
The initial value of an ECMAScript property is the value defined by the platform for that property, i.e. the value it would have in the absence of any shadowing by content script.
The browser chrome is a non-normative term to refer to the representation through which the user interacts with the user agent itself, as distinct from the accessed web content. Examples of browser chrome elements include, but are not limited to, toolbars (such as the bookmark toolbar), menus (such as the file or context menu), buttons (such as the back and forward buttons), door hangers (such as security and certificate indicators), and decorations (such as operating system widget borders).
The webdriver-active flag is set to true when the user agent is under remote control. It is initially false.
WebIDL
Navigator includes NavigatorAutomationInformation
;
The NavigatorAutomationInformation
interface
should not be exposed on WorkerNavigator
.
Returns true if webdriver-active flag is set, false otherwise.
The WebDriver protocol consists of communication between:
The local end represents the client side of the protocol, which is usually in the form of language-specific libraries providing an API on top of the WebDriver protocol. This specification does not place any restrictions on the details of those libraries above the level of the wire protocol.
For remote ends the standard defines two broad conformance classes, known as node types:
All remote end node types must be black-box indistinguishable from a remote end, from the point of view of local end, and so are bound by the requirements on a remote end in terms of the wire protocol.
The readiness state of a remote end indicates whether it is free to accept new connections. It must be false if the implementation is an endpoint node and the list of active HTTP sessions is not empty, or otherwise if the remote end is known to be in a state in which attempting to create new sessions would fail. In all other cases it must be true.
If the intermediary node is a multiplexer that manages multiple endpoint nodes, this might indicate its ability to purvey more sessions, for example if it has hit its maximum capacity.
WebDriver remote ends must provide an HTTP compliant wire protocol where the endpoints map to different commands.
As this standard only defines the remote end protocol, it puts no demands to how local ends should be implemented. Local ends are only expected to be compatible to the extent that they can speak the remote end's protocol; no requirements are made upon their exposed user-facing API.
Various parts of this specification are written in terms of step-by-step algorithms. The details of these algorithms do not have any normative significance; implementations are free to adopt any implementation strategy that produces equivalent output to the specification. In particular, algorithms in this document are optimized for readability rather than performance.
Where algorithms that return values are fallible, they are written in terms of returning either success or error. A success value has an associated data field which encapsulates the value returned, whereas an error value has an associated error code.
When calling a fallible algorithm, the construct “Let result be the result of trying to call algorithm” is equivalent to
Let temp be the result of calling algorithm.
If temp is an error return temp, otherwise let result be temp's data field.
The result of getting a property with name from object is defined as being the same as the result of calling Object.[[GetOwnProperty]](name) on object.
The result of getting a property with default with
arguments name and default
from object is defined as being the same as the result of
calling
Object.[[GetOwnProperty]](name)
on object if that results in a value other
than undefined
and default otherwise.
Setting a property with arguments name and value on object is defined as being the same as calling Object.[[Put]](name, value) on object.
The result of JSON serialization with object of type JSON Object is defined as the result of calling stringify(object).
The result of JSON deserialization with text is defined as the result of calling parse(text).
The WebDriver protocol is organized into commands. Each HTTP request with a method and template defined in this specification represents a single command, and therefore each command produces a single HTTP response.
In response to a command, a remote end will run a series of actions known as remote end steps. These provide the sequences of actions that a remote end takes when it receives a particular command.
The remote end is an HTTP server reading requests from the client and writing responses, typically over a TCP socket. For the purposes of this specification we model the data transmission between a particular local end and remote end with a connection to which the remote end may write bytes and read bytes. However the exact details of how this connection works and how it is established are out of scope.
After a connection is established, the remote end must run the following steps:
While the connection is not closed:
Read bytes from the connection until a complete HTTP request can be constructed from the data. Let request be a request constructed from the received data, according to the requirements of [RFC7230]. If it is not possible to construct a complete HTTP request, the remote end must either close the connection, return an HTTP response with status code 500, or return an error with error code unknown error.
Let request match be the result of the algorithm to match a request with request's method and URL as arguments.
If request match is of type error, send an error with request match's error code and continue.
Otherwise, let command and URL variables be request match's data.
Let session be null.
If URL variables contains "session id"
:
This condition is intended to exclude the New Session and Status commands and any extension commands which do not operate on a particular session.
Let session id be URL variables["session id
"].
For each active session in the list of active sessions:
If active session's session ID is equal to session id, then let session be active session, and break.
If the session is null
send an error with error code invalid session id,
then continue.
Enqueue a task on remote end's request queue to run the following steps:
Let parameters be null
.
If request's method is POST:
Let parse result be the result of parsing as JSON with request's body as the argument. If this process throws an exception, return an error with error code invalid argument and jump back to step 1 in this overall algorithm.
If parse result is not an Object, send an error with error code invalid argument and jump back to step 1 in this overall algorithm.
Otherwise, let parameters be parse result.
Let navigate result be the result of wait for navigation to complete with session.
If navigate result is an error, send an error with error code equal to navigate result's error code and return.
Let response result be the return value obtained by running the remote end steps for command with session, URL variables, and parameters.
If response result is an error, send an error with error code equal to response result's error code and return.
Assert: response result is a success.
Let response data be response result's data.
Send a response with status 200 and response data.
When required to send an error, with error code and an optional error data dictionary, a remote end must run the following steps:
Let status and name be the error response data for error code.
Let message be an implementation-defined string containing a human-readable description of the reason for the error.
Let stacktrace be an implementation-defined string containing a stack trace report of the active stack frames at the time when the error occurred.
Let body be a new JSON Object initialized with the following properties:
error
"
message
"
stacktrace
"
If the error data dictionary contains any entries,
set the "data
" field on body
to a new JSON Object populated with the dictionary.
Send a response with status and body as arguments.
When required to send a response, with arguments status and data, a remote end must run the following steps:
Let response be a new response.
Set response's HTTP status to status, and status message to the string corresponding to the description of status in the status code registry.
Set the response's header with name and value with the following values:
Content-Type
application/json; charset=utf-8
"
Cache-Control
no-cache
"
Let response's body be
the UTF-8 encoded JSON
serialization of a JSON Object with a key
"value
" set to data.
Let response bytes be the byte sequence resulting from serializing response according to the rules in [RFC7230].
Write response bytes to the connection.
Request routing is the process of going from an HTTP request to the series of steps needed to implement the command represented by that request.
A remote end has an associated URL prefix, which is used as a prefix on all WebDriver-defined URLs on that remote end. This must either be undefined or a path-absolute URL.
In order to match a request given a method and URL, the following steps must be taken:
Let endpoints be a list containing each row in the table of endpoints.
Remove each entry from endpoints for which the concatenation of the URL prefix and the entry's URI template does not have a valid expansion equal to URL's path.
If there are no entries in endpoints, return error with error code unknown command.
Remove each entry in endpoints for which the method column is not equal to method.
If there are no entries in endpoints, return error with error code unknown method.
There is now exactly one entry in endpoints; let entry be this entry.
Let URI template be the concatenation of URL prefix with entry's URI template.
Let command be entry's command.
Let URL variables be a map with one entry for each variable defined in URI template, with the entry name equal to the template variable name, and the entry value being the variable value required to expand the URI template to match URL's path.
Return success with data command and URL variables.
The following table of endpoints lists the method and URI template for each endpoint node command. Extension commands are implicitly appended to this table.
Method | URI Template | Command |
---|---|---|
POST | /session | New Session |
DELETE | /session/{session id} | Delete Session |
GET | /status | Status |
GET | /session/{session id}/timeouts | Get Timeouts |
POST | /session/{session id}/timeouts | Set Timeouts |
POST | /session/{session id}/url | Navigate To |
GET | /session/{session id}/url | Get Current URL |
POST | /session/{session id}/back | Back |
POST | /session/{session id}/forward | Forward |
POST | /session/{session id}/refresh | Refresh |
GET | /session/{session id}/title | Get Title |
GET | /session/{session id}/window | Get Window Handle |
DELETE | /session/{session id}/window | Close Window |
POST | /session/{session id}/window | Switch To Window |
GET | /session/{session id}/window/handles | Get Window Handles |
POST | /session/{session id}/window/new | New Window |
POST | /session/{session id}/frame | Switch To Frame |
POST | /session/{session id}/frame/parent | Switch To Parent Frame |
GET | /session/{session id}/window/rect | Get Window Rect |
POST | /session/{session id}/window/rect | Set Window Rect |
POST | /session/{session id}/window/maximize | Maximize Window |
POST | /session/{session id}/window/minimize | Minimize Window |
POST | /session/{session id}/window/fullscreen | Fullscreen Window |
GET | /session/{session id}/element/active | Get Active Element |
GET | /session/{session id}/element/{element id}/shadow | Get Element Shadow Root |
POST | /session/{session id}/element | Find Element |
POST | /session/{session id}/elements | Find Elements |
POST | /session/{session id}/element/{element id}/element | Find Element From Element |
POST | /session/{session id}/element/{element id}/elements | Find Elements From Element |
POST | /session/{session id}/shadow/{shadow id}/element | Find Element From Shadow Root |
POST | /session/{session id}/shadow/{shadow id}/elements | Find Elements From Shadow Root |
GET | /session/{session id}/element/{element id}/selected | Is Element Selected |
GET | /session/{session id}/element/{element id}/attribute/{name} | Get Element Attribute |
GET | /session/{session id}/element/{element id}/property/{name} | Get Element Property |
GET | /session/{session id}/element/{element id}/css/{property name} | Get Element CSS Value |
GET | /session/{session id}/element/{element id}/text | Get Element Text |
GET | /session/{session id}/element/{element id}/name | Get Element Tag Name |
GET | /session/{session id}/element/{element id}/rect | Get Element Rect |
GET | /session/{session id}/element/{element id}/enabled | Is Element Enabled |
GET | /session/{session id}/element/{element id}/computedrole | Get Computed Role |
GET | /session/{session id}/element/{element id}/computedlabel | Get Computed Label |
POST | /session/{session id}/element/{element id}/click | Element Click |
POST | /session/{session id}/element/{element id}/clear | Element Clear |
POST | /session/{session id}/element/{element id}/value | Element Send Keys |
GET | /session/{session id}/source | Get Page Source |
POST | /session/{session id}/execute/sync | Execute Script |
POST | /session/{session id}/execute/async | Execute Async Script |
GET | /session/{session id}/cookie | Get All Cookies |
GET | /session/{session id}/cookie/{name} | Get Named Cookie |
POST | /session/{session id}/cookie | Add Cookie |
DELETE | /session/{session id}/cookie/{name} | Delete Cookie |
DELETE | /session/{session id}/cookie | Delete All Cookies |
POST | /session/{session id}/actions | Perform Actions |
DELETE | /session/{session id}/actions | Release Actions |
POST | /session/{session id}/alert/dismiss | Dismiss Alert |
POST | /session/{session id}/alert/accept | Accept Alert |
GET | /session/{session id}/alert/text | Get Alert Text |
POST | /session/{session id}/alert/text | Send Alert Text |
GET | /session/{session id}/screenshot | Take Screenshot |
GET | /session/{session id}/element/{element id}/screenshot | Take Element Screenshot |
POST | /session/{session id}/print | Print Page |
Errors are represented in the WebDriver protocol
by an HTTP response with an HTTP status in the 4xx or 5xx range,
and a JSON body containing details of the error.
The body is a JSON Object
and has a field named "value
"
whose value is an object bearing three, and sometimes four, fields:
error
", containing a string indicating the error code.
message
", containing an implementation-defined string
with a human readable description of the kind of error that occurred.
stacktrace
", containing an implementation-defined string
with a stack trace report of the active stack frames at the time when the error occurred.
data
", which is a JSON Object
with additional error data helpful in diagnosing the error.
The following table lists each error code,
its associated HTTP status,
JSON error
code,
and a non-normative description of the error.
The error response data for a particular error code
is the values of the HTTP Status
and JSON Error Code columns for the row corresponding to that error code.
Error Code | HTTP Status | JSON Error Code | Description |
---|---|---|---|
element click intercepted | 400 | element click intercepted
| The Element Click command could not be completed because the element receiving the events is obscuring the element that was requested clicked. |
element not interactable | 400 | element not interactable
| A command could not be completed because the element is not pointer- or keyboard interactable. |
insecure certificate | 400 | insecure certificate
| Navigation caused the user agent to hit a certificate warning, which is usually the result of an expired or invalid TLS certificate. |
invalid argument | 400 | invalid argument
| The arguments passed to a command are either invalid or malformed. |
invalid cookie domain | 400 | invalid cookie domain
| An illegal attempt was made to set a cookie under a different domain than the current page. |
invalid element state | 400 | invalid element state
| A command could not be completed because the element is in an invalid state, e.g. attempting to clear an element that isn't both editable and resettable. |
invalid selector | 400 | invalid selector
| Argument was an invalid selector. |
invalid session id | 404 | invalid session id
| Occurs if the given session id is not in the list of active sessions, meaning the session either does not exist or that it's not active. |
javascript error | 500 | javascript error
| An error occurred while executing JavaScript supplied by the user. |
move target out of bounds | 500 | move target out of bounds
| The target for mouse interaction is not in the browser's viewport and cannot be brought into that viewport. |
no such alert | 404 | no such alert
| An attempt was made to operate on a modal dialog when one was not open. |
no such cookie | 404 | no such cookie
| No cookie matching the given path name was found amongst the associated cookies of session's current browsing context's active document. |
no such element | 404 | no such element
| An element could not be located on the page using the given search parameters. |
no such frame | 404 | no such frame
| A command to switch to a frame could not be satisfied because the frame could not be found. |
no such window | 404 | no such window
| A command to switch to a window could not be satisfied because the window could not be found. |
no such shadow root | 404 | no such shadow root
| The element does not have a shadow root. |
script timeout error | 500 | script timeout
| A script did not complete before its timeout expired. |
session not created | 500 | session not created
| A new session could not be created. |
stale element reference | 404 | stale element reference
| A command failed because the referenced element is no longer attached to the DOM. |
detached shadow root | 404 | detached shadow root
| A command failed because the referenced shadow root is no longer attached to the DOM. |
timeout | 500 | timeout
| An operation did not complete before its timeout expired. |
unable to set cookie | 500 | unable to set cookie
| A command to set a cookie's value could not be satisfied. |
unable to capture screen | 500 | unable to capture screen
| A screen capture was made impossible. |
unexpected alert open | 500 | unexpected alert open
| A modal dialog was open, blocking this operation. |
unknown command | 404 | unknown command
| A command could not be executed because the remote end is not aware of it. |
unknown error | 500 | unknown error
| An unknown error occurred in the remote end while processing the command. |
unknown method | 405 | unknown method
| The requested command matched a known URL but did not match any method for that URL. |
unsupported operation | 500 | unsupported operation
| Indicates that a command that should have executed properly cannot be supported for some reason. |
An error data dictionary is a mapping of string keys to JSON serializable values that can optionally be included with error objects.
Using the terminology defined in this section, others may define additional commands that seamlessly integrate with the standard protocol. This allows vendors to expose functionality that is specific to their user agent, and it also allows other web standards to define commands for automating new platform features.
Commands defined in this way are called extension commands and behave no differently than other commands; each has a dedicated HTTP endpoint and a set of remote end steps.
Each extension command has an associated extension command URI Template that is a URI Template string, and which should bear some resemblance to what the command performs. This value, along with the HTTP method and extension command, is added to the table of endpoints and thus follows the same rules for request routing as that of other built-in commands.
In order to avoid potential resource conflicts with other implementations, vendor-specific extension command URI Templates must begin with one or more path segments which uniquely identifies the vendor and UA. It is suggested that vendors use their vendor prefixes without additional characters as outlined in [CSS21], notably in section 4.1.2.2 on vendor keywords, as the name for this path element, and include a vendor-chosen UA identifier.
Other specifications may define additional WebDriver capabilities. Each defined
capability must have a capability name which
is a string not containing a ":
" (colon) character,
an additional capability deserialization
algorithm which is a set of steps taking a single
argument value which has a JSON type, returning
either success wrapping the deserialized capability value
or error.
An additional WebDriver capability may also define
a matched capability serialization algorithm,
which is a set of steps used to determine if a capability is matched
by the current implementation and provide any computed value to return
to the user. This set of steps takes a single
argument value, which is the output of the
corresponding additional capability deserialization algorithm,
and returns either null
to indicate the capability
is not matched, or a non-null JSON-serializable value if the
capability is matched.
Other specifications may also define WebDriver new session algorithms, which are called just after a new session is created, and before the new session response is sent to the remote end. These algorithms are called with session representing the WebDriver session that will be established, and capabilities, the capabilities object that will be returned to the remote end. It is permitted for such an algorithm to modify any entry in the capabilities object with a name that's an additional WebDriver capability defined by the same specification.
Remote ends may also introduce
extension capabilities
that are extra capabilities
used to provide configuration or fulfill other vendor-specific needs.
Extension capabilities' key
must contain a ":
" (colon) character,
denoting an implementation specific namespace.
The value can be arbitrary JSON types.
As with extension commands,
it is suggested that the key used to denote
the extension capability namespace
is based on the vendor keywords
listed in [CSS21]
and precedes the first ":
" character in the string.
WebDriver capabilities are used to communicate the features supported by a given implementation. The local end may use capabilities to define which features it requires the remote end to satisfy when creating a new session. Likewise, the remote end uses capabilities to describe the full feature set for a session.
The following table of standard capabilities enumerates the capabilities each implementation must support. An implementation may define additional extension capabilities.
Capability | Key | Value Type | Description |
---|---|---|---|
Browser name | "browserName "
| string | Identifies the user agent. |
Browser version | "browserVersion "
| string | Identifies the version of the user agent. |
Platform name | "platformName "
| string | Identifies the operating system of the endpoint node. |
Accept insecure TLS certificates | "acceptInsecureCerts "
| boolean | Indicates whether untrusted and self-signed TLS certificates are implicitly trusted on navigation for the duration of the session. |
Page load strategy | "pageLoadStrategy "
| string | Defines the session's page load strategy. |
Proxy configuration | "proxy "
| JSON Object | Defines the session's proxy configuration. |
Window dimensioning/positioning | "setWindowRect "
| boolean | Indicates whether the remote end supports all of the resizing and repositioning commands. |
Session timeouts | "timeouts "
| JSON Object | Describes the timeouts imposed on certain session operations. |
Strict file interactability | "strictFileInteractability "
| boolean | Defines the session's strict file interactability. |
Unhandled prompt behavior | "unhandledPromptBehavior "
| string | Describes the session's user prompt handler.
Defaults to "dismiss and notify ".
|
User Agent | "userAgent "
| string | Identifies the default User-Agent value of the endpoint node. |
The proxy configuration capability is a JSON Object nested within the primary capabilities. Implementations may define additional proxy configuration options, but they must not alter the semantics of those listed below.
Key | Value Type | Description | Valid values |
---|---|---|---|
proxyType
| string | Indicates the type of proxy configuration. | "pac ",
"direct ",
"autodetect ",
"system ",
or "manual ".
|
proxyAutoconfigUrl
| string | Defines the URL for a proxy autoconfiguration file
if is equal to "pac ".
| Any URL. |
httpProxy
| string | Defines the proxy host for HTTP traffic when
the is "manual ".
| A host and optional port for
scheme "http ".
|
noProxy
| array | Lists the address for which the proxy should be bypassed when
the is "manual ".
| A List containing any number of Strings. |
sslProxy
| string | Defines the proxy host for encrypted TLS traffic
when the is "manual ".
| A host and optional port for
scheme "https ".
|
socksProxy
| string | Defines the proxy host for a SOCKS proxy
when the is "manual ".
| A host and optional port with an undefined scheme. |
socksVersion
| number | Defines the SOCKS proxy version
when the is "manual ".
| Any integer between 0 and 255 inclusive. |
A host and optional port for a scheme is defined as being a valid host, optionally followed by a colon and a valid port. The host may include credentials. If the port is omitted and scheme has a default port, this is the implied port. Otherwise, the port is left undefined.
A
of "proxyType
direct
" indicates
that the browser should not use a proxy at all.
A
of "proxyType
system
" indicates
that the browser should use the various proxies configured for the
underlying Operating System.
A
of "proxyType
autodetect
"
indicates that the proxy to use should be detected in an
implementation-specific way.
The remote end steps to deserialize as a proxy argument parameter are:
If parameter is not a JSON Object return an error with error code invalid argument.
Let proxy be a new, empty proxy configuration object.
For each enumerable own property in parameter run the following substeps:
Let key be the name of the property.
Let value be the result of getting a property named name from parameter.
If there is no matching key
for key
in the proxy configuration table return an error
with error code invalid argument.
If value is not one of the
valid values
for that key
, return
an error with error code invalid argument.
Set a property key to value on proxy.
If proxy does not have an own property for
"proxyType
" return an error with error
code invalid argument.
If the result of getting a property
named "proxyType
" from proxy equals
"pac
", and proxy does not have an
own property for "proxyAutoconfigUrl
" return
an error with error code invalid argument.
If proxy has an own property for
"socksProxy
" and does not have an own property
for "socksVersion
" return an error with error
code invalid argument.
Return success with data proxy.
A proxy configuration object is a JSON Object where each of its own properties matching keys in the proxy configuration meets the validity criteria for that key.
To process capabilities given parameters, and session configuration flags flags, the endpoint node must take the following steps:
Let capabilities request be the result of getting the property
"capabilities
" from parameters.
If capabilities request is not a JSON Object, return error with error code invalid argument.
Let required capabilities be the result of getting the property
"alwaysMatch
" from capabilities request.
If required capabilities is undefined, set the value to an empty JSON Object.
Let required capabilities be the result of trying to validate capabilities with arguments required capabilities and flag.
Let all first match capabilities be the result of getting the property
"firstMatch
" from capabilities request.
If all first match capabilities is undefined, set the value to a List with a single entry of an empty JSON Object.
If all first match capabilities is not a List with one or more entries, return error with error code invalid argument.
Let validated first match capabilities be an empty List.
For each first match capabilities corresponding to an indexed property in all first match capabilities:
Let validated capabilities be the result of trying to validate capabilities with arguments first match capabilities and flags.
Append validated capabilities to validated first match capabilities.
Let merged capabilities be an empty List.
For each first match capabilities corresponding to an indexed property in validated first match capabilities:
Let merged be the result of trying to merge capabilities with required capabilities and first match capabilities as arguments.
Append merged to merged capabilities.
For each capabilities corresponding to an indexed property in merged capabilities:
Let matched capabilities be the result of trying to match capabilities with capabilities as an argument.
If matched capabilities is not null
,
return success with data matched capabilities.
When required to validate capabilities with argument capabilities:
If capabilities is not a JSON Object return an error with error code invalid argument.
Let result be an empty JSON Object.
For each enumerable own property in capabilities, run the following substeps:
Let name be the name of the property.
Let value be the result of getting a property named name from capabilities.
Run the substeps of the first matching condition:
null
Let deserialized be set to null
.
acceptInsecureCerts
"
If value is not a boolean return an error with error code invalid argument. Otherwise, let deserialized be set to value.
browserName
"
browserVersion
"
platformName
"
If value is not a string return an error with error code invalid argument. Otherwise, let deserialized be set to value.
pageLoadStrategy
"
Let deserialized be the result of trying to deserialize as a page load strategy with argument value.
proxy
"
Let deserialized be the result of trying to deserialize as a proxy with argument value.
strictFileInteractability
"
If value is not a boolean return an error with error code invalid argument. Otherwise, let deserialized be set to value
timeouts
"
Let deserialized be the result of trying to deserialize as timeouts configuration with value.
unhandledPromptBehavior
"
Let deserialized be the result of trying to deserialize as an unhandled prompt behavior with argument value.
Let deserialized be the result of trying to run the additional capability deserialization algorithm for the extension capability corresponding to name, with argument value.
If name is known to the implementation, let deserialized be the result of trying to deserialize value in an implementation-specific way. Otherwise, let deserialized be set to value.
Return an error with error code invalid argument.
If deserialized is not null
,
set a property on result with name name
and value deserialized.
When merging capabilities with JSON Object arguments primary and secondary, an endpoint node must take the following steps:
Let result be a new JSON Object.
For each enumerable own property in primary, run the following substeps:
Let name be the name of the property.
Let value be the result of getting a property named name from primary.
If secondary is undefined, return result.
For each enumerable own property in secondary, run the following substeps:
Let name be the name of the property.
Let value be the result of getting a property named name from secondary.
Let primary value be the result of getting the property name from primary.
If primary value is not undefined, return an error with error code invalid argument.
Return result.
When matching capabilities given JSON Object capabilities, and a session configuration flags flags, an endpoint node must take the following steps:
Let matched capabilities be a JSON Object with the following entries:
browserName
"
browserVersion
"
platformName
"
acceptInsecureCerts
"
strictFileInteractability
"
setWindowRect
"
userAgent
"
If flags contains "http
", add the
following entries to matched capabilities:
strictFileInteractability
"
Optionally add extension capabilities as entries to matched capabilities. The values of these may be elided, and there is no requirement that all extension capabilities be added.
For each name and value corresponding to capabilities's own properties:
Let match value equal value.
Run the substeps of the first matching name:
browserName
"
If value is not a string equal to
the "browserName
" entry in
matched capabilities, return success
with data null
.
There is a chance the remote end will need
to start a browser process to correctly determine
the browserName
. Lightweight checks are preferred
before this is done.
browserVersion
"
Compare value
to the "browserVersion
" entry in matched capabilities
using an implementation-defined comparison algorithm.
The comparison is to accept a value
that places constraints on the version using
the "<
", "<=
", ">
",
and ">=
" operators.
If the two values do not match,
return success with data null
.
Version comparison is left as an implementation detail since each user agent will likely have conflicting methods of encoding the user agent version, and standardizing these schemes is beyond the scope of this standard.
There is a chance the remote end will need
to start a browser process to correctly determine
the browserVersion
. Lightweight checks are preferred
before this is done.
platformName
"
If value is not a string equal
to the "platformName
" entry in matched capabilities,
return success with data null
.
The following platform names are in common usage with well-understood semantics and, when matching capabilities for platform name, greatest interoperability can be achieved by honoring them as valid synonyms for well-known Operating Systems:
Key | System |
---|---|
"linux " | Any server or desktop system based upon the Linux kernel. |
"mac " | Any version of Apple's macOS. |
"windows " | Any version of Microsoft Windows, including desktop and mobile versions. |
This list is not exhaustive.
When returning capabilities from New Session,
it is valid to return a more
specific platformName
, allowing users to
correctly identify the Operating System the WebDriver
implementation is running on.
acceptInsecureCerts
"
If accept insecure TLS flag is set and not equal
to value, return success with
data null
.
If the endpoint node does not support insecure TLS certificates and this is the reason no match is ultimately made, it is useful to provide this information to the local end.
proxy
"
If the has proxy configuration flag is set, or if
the proxy configuration defined in value is not one
that passes the endpoint node's implementation-specific
validity checks, return success with
data null
.
A local end would only send this capability if it expected it to be honored and the configured proxy used. The intent is that if this is not possible a new session will not be established.
unhandledPromptBehavior
"
If check user prompt handler matches
with value is false, return success with
data null
.
If name is the name of an additional WebDriver capability which defines a matched capability serialization algorithm, let match value be the result of running the matched capability serialization algorithm for capability name with arguments value, and flags.
Otherwise, if name is the key of an
extension capability, let match value be the
result of trying implementation-specific steps to
match on name with value. If the
match is not successful, return success with
data null
.
If match value is not null, set a property on matched capabilities with name name and value match value.
Return success with data matched capabilities.
A WebDriver session represents the logical connection between a local end and a specific remote end. The session object holds state specific to that connection.
An intermediary node will maintain an associated session for each active session. This is the session on the upstream neighbor that is created when the intermediary node executes the New Session command. Closing a