blob: bf51b17511b56a211dc4a87b36595999c926e115 [file] [edit]
<!DOCTYPE html><html lang="en" style="font-size:16px"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Source: generate_bidi.mjs</title><!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]--><script src="scripts/third-party/hljs.js" defer="defer"></script><script src="scripts/third-party/hljs-line-num.js" defer="defer"></script><script src="scripts/third-party/popper.js" defer="defer"></script><script src="scripts/third-party/tippy.js" defer="defer"></script><script src="scripts/third-party/tocbot.min.js"></script><script>var baseURL="/",locationPathname="";baseURL=(locationPathname=document.location.pathname).substr(0,locationPathname.lastIndexOf("/")+1)</script><link rel="stylesheet" href="styles/clean-jsdoc-theme.min.css"><svg aria-hidden="true" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="display:none"><defs><symbol id="copy-icon" viewbox="0 0 488.3 488.3"><g><path d="M314.25,85.4h-227c-21.3,0-38.6,17.3-38.6,38.6v325.7c0,21.3,17.3,38.6,38.6,38.6h227c21.3,0,38.6-17.3,38.6-38.6V124 C352.75,102.7,335.45,85.4,314.25,85.4z M325.75,449.6c0,6.4-5.2,11.6-11.6,11.6h-227c-6.4,0-11.6-5.2-11.6-11.6V124 c0-6.4,5.2-11.6,11.6-11.6h227c6.4,0,11.6,5.2,11.6,11.6V449.6z"/><path d="M401.05,0h-227c-21.3,0-38.6,17.3-38.6,38.6c0,7.5,6,13.5,13.5,13.5s13.5-6,13.5-13.5c0-6.4,5.2-11.6,11.6-11.6h227 c6.4,0,11.6,5.2,11.6,11.6v325.7c0,6.4-5.2,11.6-11.6,11.6c-7.5,0-13.5,6-13.5,13.5s6,13.5,13.5,13.5c21.3,0,38.6-17.3,38.6-38.6 V38.6C439.65,17.3,422.35,0,401.05,0z"/></g></symbol><symbol id="search-icon" viewBox="0 0 512 512"><g><g><path d="M225.474,0C101.151,0,0,101.151,0,225.474c0,124.33,101.151,225.474,225.474,225.474 c124.33,0,225.474-101.144,225.474-225.474C450.948,101.151,349.804,0,225.474,0z M225.474,409.323 c-101.373,0-183.848-82.475-183.848-183.848S124.101,41.626,225.474,41.626s183.848,82.475,183.848,183.848 S326.847,409.323,225.474,409.323z"/></g></g><g><g><path d="M505.902,476.472L386.574,357.144c-8.131-8.131-21.299-8.131-29.43,0c-8.131,8.124-8.131,21.306,0,29.43l119.328,119.328 c4.065,4.065,9.387,6.098,14.715,6.098c5.321,0,10.649-2.033,14.715-6.098C514.033,497.778,514.033,484.596,505.902,476.472z"/></g></g></symbol><symbol id="font-size-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11.246 15H4.754l-2 5H.6L7 4h2l6.4 16h-2.154l-2-5zm-.8-2L8 6.885 5.554 13h4.892zM21 12.535V12h2v8h-2v-.535a4 4 0 1 1 0-6.93zM19 18a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/></symbol><symbol id="add-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></symbol><symbol id="minus-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M5 11h14v2H5z"/></symbol><symbol id="dark-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M10 7a7 7 0 0 0 12 4.9v.1c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2h.1A6.979 6.979 0 0 0 10 7zm-6 5a8 8 0 0 0 15.062 3.762A9 9 0 0 1 8.238 4.938 7.999 7.999 0 0 0 4 12z"/></symbol><symbol id="light-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-2a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM11 1h2v3h-2V1zm0 19h2v3h-2v-3zM3.515 4.929l1.414-1.414L7.05 5.636 5.636 7.05 3.515 4.93zM16.95 18.364l1.414-1.414 2.121 2.121-1.414 1.414-2.121-2.121zm2.121-14.85l1.414 1.415-2.121 2.121-1.414-1.414 2.121-2.121zM5.636 16.95l1.414 1.414-2.121 2.121-1.414-1.414 2.121-2.121zM23 11v2h-3v-2h3zM4 11v2H1v-2h3z"/></symbol><symbol id="reset-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M18.537 19.567A9.961 9.961 0 0 1 12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10c0 2.136-.67 4.116-1.81 5.74L17 12h3a8 8 0 1 0-2.46 5.772l.997 1.795z"/></symbol><symbol id="down-icon" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.7803 6.21967C13.0732 6.51256 13.0732 6.98744 12.7803 7.28033L8.53033 11.5303C8.23744 11.8232 7.76256 11.8232 7.46967 11.5303L3.21967 7.28033C2.92678 6.98744 2.92678 6.51256 3.21967 6.21967C3.51256 5.92678 3.98744 5.92678 4.28033 6.21967L8 9.93934L11.7197 6.21967C12.0126 5.92678 12.4874 5.92678 12.7803 6.21967Z"></path></symbol><symbol id="codepen-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M16.5 13.202L13 15.535v3.596L19.197 15 16.5 13.202zM14.697 12L12 10.202 9.303 12 12 13.798 14.697 12zM20 10.869L18.303 12 20 13.131V10.87zM19.197 9L13 4.869v3.596l3.5 2.333L19.197 9zM7.5 10.798L11 8.465V4.869L4.803 9 7.5 10.798zM4.803 15L11 19.131v-3.596l-3.5-2.333L4.803 15zM4 13.131L5.697 12 4 10.869v2.262zM2 9a1 1 0 0 1 .445-.832l9-6a1 1 0 0 1 1.11 0l9 6A1 1 0 0 1 22 9v6a1 1 0 0 1-.445.832l-9 6a1 1 0 0 1-1.11 0l-9-6A1 1 0 0 1 2 15V9z"/></symbol><symbol id="close-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636z"/></symbol><symbol id="menu-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 4h18v2H3V4zm0 7h18v2H3v-2zm0 7h18v2H3v-2z"/></symbol></defs></svg></head><body data-theme="dark"><div class="sidebar-container"><div class="sidebar" id="sidebar"><a href="/" class="sidebar-title sidebar-title-anchor">Selenium WebDriver JavaScript API</a><div class="sidebar-items-container"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-selenium-webdriver_chrome.html">selenium-webdriver/chrome</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chromium.html">selenium-webdriver/chromium</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_edge.html">selenium-webdriver/edge</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_firefox.html">selenium-webdriver/firefox</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_ie.html">selenium-webdriver/ie</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_safari.html">selenium-webdriver/safari</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-classes"><div>Classes</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="Actions.html">Actions</a></div><div class="sidebar-section-children"><a href="Alert.html">Alert</a></div><div class="sidebar-section-children"><a href="AlertPromise.html">AlertPromise</a></div><div class="sidebar-section-children"><a href="ArgumentValue.html">ArgumentValue</a></div><div class="sidebar-section-children"><a href="BaseLogEntry.html">BaseLogEntry</a></div><div class="sidebar-section-children"><a href="BaseParameters.html">BaseParameters</a></div><div class="sidebar-section-children"><a href="BeforeRequestSent.html">BeforeRequestSent</a></div><div class="sidebar-section-children"><a href="BoxClipRectangle.html">BoxClipRectangle</a></div><div class="sidebar-section-children"><a href="global.html#Browser">Browser</a></div><div class="sidebar-section-children"><a href="BrowsingContext.html">BrowsingContext</a></div><div class="sidebar-section-children"><a href="BrowsingContextInfo.html">BrowsingContextInfo</a></div><div class="sidebar-section-children"><a href="BrowsingContextInspector.html">BrowsingContextInspector</a></div><div class="sidebar-section-children"><a href="BrowsingContextPartitionDescriptor.html">BrowsingContextPartitionDescriptor</a></div><div class="sidebar-section-children"><a href="Build.html">Build</a></div><div class="sidebar-section-children"><a href="Builder.html">Builder</a></div><div class="sidebar-section-children"><a href="By.html">By</a></div><div class="sidebar-section-children"><a href="BytesValue.html">BytesValue</a></div><div class="sidebar-section-children"><a href="Capabilities.html">Capabilities</a></div><div class="sidebar-section-children"><a href="CaptureScreenshotParameters.html">CaptureScreenshotParameters</a></div><div class="sidebar-section-children"><a href="ChannelValue.html">ChannelValue</a></div><div class="sidebar-section-children"><a href="ClientWindowInfo.html">ClientWindowInfo</a></div><div class="sidebar-section-children"><a href="ClipRectangle.html">ClipRectangle</a></div><div class="sidebar-section-children"><a href="Color.html">Color</a></div><div class="sidebar-section-children"><a href="Command.html">Command</a></div><div class="sidebar-section-children"><a href="Command.html">Command</a></div><div class="sidebar-section-children"><a href="Condition.html">Condition</a></div><div class="sidebar-section-children"><a href="ConsoleLogEntry.html">ConsoleLogEntry</a></div><div class="sidebar-section-children"><a href="ContinueRequestParameters.html">ContinueRequestParameters</a></div><div class="sidebar-section-children"><a href="ContinueResponseParameters.html">ContinueResponseParameters</a></div><div class="sidebar-section-children"><a href="Cookie.html">Cookie</a></div><div class="sidebar-section-children"><a href="CookieFilter.html">CookieFilter</a></div><div class="sidebar-section-children"><a href="CreateContextParameters.html">CreateContextParameters</a></div><div class="sidebar-section-children"><a href="Credential.html">Credential</a></div><div class="sidebar-section-children"><a href="DetachedShadowRootError.html">DetachedShadowRootError</a></div><div class="sidebar-section-children"><a href="Device.html">Device</a></div><div class="sidebar-section-children"><a href="Domain.html">Domain</a></div><div class="sidebar-section-children"><a href="DriverService.html">DriverService</a></div><div class="sidebar-section-children"><a href="DriverService.Builder.html">Builder</a></div><div class="sidebar-section-children"><a href="ElementClickInterceptedError.html">ElementClickInterceptedError</a></div><div class="sidebar-section-children"><a href="ElementClipRectangle.html">ElementClipRectangle</a></div><div class="sidebar-section-children"><a href="ElementNotInteractableError.html">ElementNotInteractableError</a></div><div class="sidebar-section-children"><a href="ElementNotSelectableError.html">ElementNotSelectableError</a></div><div class="sidebar-section-children"><a href="Entry.html">Entry</a></div><div class="sidebar-section-children"><a href="Environment.html">Environment</a></div><div class="sidebar-section-children"><a href="EvaluateResultException.html">EvaluateResultException</a></div><div class="sidebar-section-children"><a href="EvaluateResultSuccess.html">EvaluateResultSuccess</a></div><div class="sidebar-section-children"><a href="ExceptionDetails.html">ExceptionDetails</a></div><div class="sidebar-section-children"><a href="Executor.html">Executor</a></div><div class="sidebar-section-children"><a href="FetchError.html">FetchError</a></div><div class="sidebar-section-children"><a href="FetchTimingInfo.html">FetchTimingInfo</a></div><div class="sidebar-section-children"><a href="FileDetector.html">FileDetector</a></div><div class="sidebar-section-children"><a href="FileDetector.html">FileDetector</a></div><div class="sidebar-section-children"><a href="GenericLogEntry.html">GenericLogEntry</a></div><div class="sidebar-section-children"><a href="Header.html">Header</a></div><div class="sidebar-section-children"><a href="HttpClient.html">HttpClient</a></div><div class="sidebar-section-children"><a href="HttpResponse.html">HttpResponse</a></div><div class="sidebar-section-children"><a href="Index_.html">Index</a></div><div class="sidebar-section-children"><a href="Initiator.html">Initiator</a></div><div class="sidebar-section-children"><a href="Input.html">Input</a></div><div class="sidebar-section-children"><a href="InsecureCertificateError.html">InsecureCertificateError</a></div><div class="sidebar-section-children"><a href="InvalidArgumentError.html">InvalidArgumentError</a></div><div class="sidebar-section-children"><a href="InvalidCharacterError.html">InvalidCharacterError</a></div><div class="sidebar-section-children"><a href="InvalidCookieDomainError.html">InvalidCookieDomainError</a></div><div class="sidebar-section-children"><a href="InvalidCoordinatesError.html">InvalidCoordinatesError</a></div><div class="sidebar-section-children"><a href="InvalidElementStateError.html">InvalidElementStateError</a></div><div class="sidebar-section-children"><a href="InvalidSelectorError.html">InvalidSelectorError</a></div><div class="sidebar-section-children"><a href="JavascriptError.html">JavascriptError</a></div><div class="sidebar-section-children"><a href="JavascriptLogEntry.html">JavascriptLogEntry</a></div><div class="sidebar-section-children"><a href="Keyboard.html">Keyboard</a></div><div class="sidebar-section-children"><a href="Level.html">Level</a></div><div class="sidebar-section-children"><a href="LocalValue.html">LocalValue</a></div><div class="sidebar-section-children"><a href="Locator.html">Locator</a></div><div class="sidebar-section-children"><a href="LogManager.html">LogManager</a></div><div class="sidebar-section-children"><a href="Logger.html">Logger</a></div><div class="sidebar-section-children"><a href="Message.html">Message</a></div><div class="sidebar-section-children"><a href="MoveTargetOutOfBoundsError.html">MoveTargetOutOfBoundsError</a></div><div class="sidebar-section-children"><a href="NavigateResult.html">NavigateResult</a></div><div class="sidebar-section-children"><a href="NavigationInfo.html">NavigationInfo</a></div><div class="sidebar-section-children"><a href="Network.html">Network</a></div><div class="sidebar-section-children"><a href="NetworkInspector.html">NetworkInspector</a></div><div class="sidebar-section-children"><a href="NoSuchAlertError.html">NoSuchAlertError</a></div><div class="sidebar-section-children"><a href="NoSuchCookieError.html">NoSuchCookieError</a></div><div class="sidebar-section-children"><a href="NoSuchElementError.html">NoSuchElementError</a></div><div class="sidebar-section-children"><a href="NoSuchFrameError.html">NoSuchFrameError</a></div><div class="sidebar-section-children"><a href="NoSuchSessionError.html">NoSuchSessionError</a></div><div class="sidebar-section-children"><a href="NoSuchShadowRootError.html">NoSuchShadowRootError</a></div><div class="sidebar-section-children"><a href="NoSuchWindowError.html">NoSuchWindowError</a></div><div class="sidebar-section-children"><a href="PartialCookie.html">PartialCookie</a></div><div class="sidebar-section-children"><a href="PartitionDescriptor.html">PartitionDescriptor</a></div><div class="sidebar-section-children"><a href="PartitionKey.html">PartitionKey</a></div><div class="sidebar-section-children"><a href="Pointer.html">Pointer</a></div><div class="sidebar-section-children"><a href="Preferences.html">Preferences</a></div><div class="sidebar-section-children"><a href="PrintResult.html">PrintResult</a></div><div class="sidebar-section-children"><a href="ProvideResponseParameters.html">ProvideResponseParameters</a></div><div class="sidebar-section-children"><a href="RealmInfo.html">RealmInfo</a></div><div class="sidebar-section-children"><a href="ReferenceValue.html">ReferenceValue</a></div><div class="sidebar-section-children"><a href="RegExpValue.html">RegExpValue</a></div><div class="sidebar-section-children"><a href="RelativeBy.html">RelativeBy</a></div><div class="sidebar-section-children"><a href="RemoteValue.html">RemoteValue</a></div><div class="sidebar-section-children"><a href="Request.html">Request</a></div><div class="sidebar-section-children"><a href="RequestData.html">RequestData</a></div><div class="sidebar-section-children"><a href="Response.html">Response</a></div><div class="sidebar-section-children"><a href="ResponseData.html">ResponseData</a></div><div class="sidebar-section-children"><a href="ResponseStarted.html">ResponseStarted</a></div><div class="sidebar-section-children"><a href="Result.html">Result</a></div><div class="sidebar-section-children"><a href="ScriptManager.html">ScriptManager</a></div><div class="sidebar-section-children"><a href="ScriptTimeoutError.html">ScriptTimeoutError</a></div><div class="sidebar-section-children"><a href="Select.html">Select</a></div><div class="sidebar-section-children"><a href="SeleniumServer.html">SeleniumServer</a></div><div class="sidebar-section-children"><a href="SerializationOptions.html">SerializationOptions</a></div><div class="sidebar-section-children"><a href="Server.html">Server</a></div><div class="sidebar-section-children"><a href="Session.html">Session</a></div><div class="sidebar-section-children"><a href="SessionNotCreatedError.html">SessionNotCreatedError</a></div><div class="sidebar-section-children"><a href="ShadowRoot.html">ShadowRoot</a></div><div class="sidebar-section-children"><a href="ShadowRootPromise.html">ShadowRootPromise</a></div><div class="sidebar-section-children"><a href="Source.html">Source</a></div><div class="sidebar-section-children"><a href="StaleElementReferenceError.html">StaleElementReferenceError</a></div><div class="sidebar-section-children"><a href="Storage.html">Storage</a></div><div class="sidebar-section-children"><a href="StorageKeyPartitionDescriptor.html">StorageKeyPartitionDescriptor</a></div><div class="sidebar-section-children"><a href="TimeoutError.html">TimeoutError</a></div><div class="sidebar-section-children"><a href="UnableToCaptureScreenError.html">UnableToCaptureScreenError</a></div><div class="sidebar-section-children"><a href="UnableToSetCookieError.html">UnableToSetCookieError</a></div><div class="sidebar-section-children"><a href="UnexpectedAlertOpenError.html">UnexpectedAlertOpenError</a></div><div class="sidebar-section-children"><a href="UnknownCommandError.html">UnknownCommandError</a></div><div class="sidebar-section-children"><a href="UnknownMethodError.html">UnknownMethodError</a></div><div class="sidebar-section-children"><a href="UnsupportedOperationError.html">UnsupportedOperationError</a></div><div class="sidebar-section-children"><a href="UrlPattern.html">UrlPattern</a></div><div class="sidebar-section-children"><a href="VirtualAuthenticatorOptions.html">VirtualAuthenticatorOptions</a></div><div class="sidebar-section-children"><a href="WebDriver.html">WebDriver</a></div><div class="sidebar-section-children"><a href="WebDriverError.html">WebDriverError</a></div><div class="sidebar-section-children"><a href="WebElement.html">WebElement</a></div><div class="sidebar-section-children"><a href="WebElementCondition.html">WebElementCondition</a></div><div class="sidebar-section-children"><a href="WebElementPromise.html">WebElementPromise</a></div><div class="sidebar-section-children"><a href="Wheel.html">Wheel</a></div><div class="sidebar-section-children"><a href="WindowRealmInfo.html">WindowRealmInfo</a></div><div class="sidebar-section-children"><a href="Zip.html">Zip</a></div><div class="sidebar-section-children"><a href="createDriver-thenableWebDriverProxy.html">thenableWebDriverProxy</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chrome-Driver.html">Driver</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chrome-Options.html">Options</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chrome-ServiceBuilder.html">ServiceBuilder</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chromium-Driver.html">Driver</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chromium-Extensions.html">Extensions</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chromium-Options.html">Options</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chromium-ServiceBuilder.html">ServiceBuilder</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_edge-Driver.html">Driver</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_edge-Options.html">Options</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_edge-ServiceBuilder.html">ServiceBuilder</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_firefox-Channel.html">Channel</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_firefox-Driver.html">Driver</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_firefox-Options.html">Options</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_firefox-ServiceBuilder.html">ServiceBuilder</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_ie-Driver.html">Driver</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_ie-Options.html">Options</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_ie-ServiceBuilder.html">ServiceBuilder</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_safari-Driver.html">Driver</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_safari-Options.html">Options</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_safari-ServiceBuilder.html">ServiceBuilder</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-interfaces"><div>Interfaces</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="Action.html">Action</a></div><div class="sidebar-section-children"><a href="Client.html">Client</a></div><div class="sidebar-section-children"><a href="global.html#Config">Config</a></div><div class="sidebar-section-children"><a href="Executor.html">Executor</a></div><div class="sidebar-section-children"><a href="ISelect.html">ISelect</a></div><div class="sidebar-section-children"><a href="IWebDriver.html">IWebDriver</a></div><div class="sidebar-section-children"><a href="global.html#ManualConfig">ManualConfig</a></div><div class="sidebar-section-children"><a href="Options.html">Options</a></div><div class="sidebar-section-children"><a href="Options.Cookie.html">Cookie</a></div><div class="sidebar-section-children"><a href="global.html#PacConfig">PacConfig</a></div><div class="sidebar-section-children"><a href="SeleniumServer.Options.html">Options</a></div><div class="sidebar-section-children"><a href="ServiceOptions.html">ServiceOptions</a></div><div class="sidebar-section-children"><a href="SuiteOptions.html">SuiteOptions</a></div><div class="sidebar-section-children"><a href="TargetBrowser.html">TargetBrowser</a></div><div class="sidebar-section-children"><a href="ThenableWebDriver.html">ThenableWebDriver</a></div><div class="sidebar-section-children"><a href="Timeouts.html">Timeouts</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#Atom">Atom</a></div><div class="sidebar-section-children"><a href="global.html#Browser">Browser</a></div><div class="sidebar-section-children"><a href="global.html#Button">Button</a></div><div class="sidebar-section-children"><a href="global.html#ByHash">ByHash</a></div><div class="sidebar-section-children"><a href="global.html#Capability">Capability</a></div><div class="sidebar-section-children"><a href="global.html#CommandLineFlag">CommandLineFlag</a></div><div class="sidebar-section-children"><a href="global.html#CommandSpec">CommandSpec</a></div><div class="sidebar-section-children"><a href="global.html#CommandTransformer">CommandTransformer</a></div><div class="sidebar-section-children"><a href="global.html#Config">Config</a></div><div class="sidebar-section-children"><a href="global.html#ErrorCode">ErrorCode</a></div><div class="sidebar-section-children"><a href="global.html#EvaluateResultType">EvaluateResultType</a></div><div class="sidebar-section-children"><a href="global.html#INTERNAL_COMPUTE_OFFSET_SCRIPT">INTERNAL_COMPUTE_OFFSET_SCRIPT</a></div><div class="sidebar-section-children"><a href="global.html#InterceptPhase">InterceptPhase</a></div><div class="sidebar-section-children"><a href="global.html#Key">Key</a></div><div class="sidebar-section-children"><a href="global.html#ManualConfig">ManualConfig</a></div><div class="sidebar-section-children"><a href="global.html#Name">Name</a></div><div class="sidebar-section-children"><a href="global.html#NonPrimitiveType">NonPrimitiveType</a></div><div class="sidebar-section-children"><a href="global.html#Origin">Origin</a></div><div class="sidebar-section-children"><a href="global.html#Origin">Origin</a></div><div class="sidebar-section-children"><a href="global.html#PINNED_BROWSERS">PINNED_BROWSERS</a></div><div class="sidebar-section-children"><a href="global.html#PacConfig">PacConfig</a></div><div class="sidebar-section-children"><a href="global.html#PageLoadStrategy">PageLoadStrategy</a></div><div class="sidebar-section-children"><a href="global.html#Platform">Platform</a></div><div class="sidebar-section-children"><a href="global.html#PrimitiveType">PrimitiveType</a></div><div class="sidebar-section-children"><a href="global.html#Protocol">Protocol</a></div><div class="sidebar-section-children"><a href="global.html#RealmType">RealmType</a></div><div class="sidebar-section-children"><a href="global.html#RemoteReferenceType">RemoteReferenceType</a></div><div class="sidebar-section-children"><a href="global.html#RemoteType">RemoteType</a></div><div class="sidebar-section-children"><a href="global.html#RequestOptions">RequestOptions</a></div><div class="sidebar-section-children"><a href="global.html#ResultOwnership">ResultOwnership</a></div><div class="sidebar-section-children"><a href="global.html#SameSite">SameSite</a></div><div class="sidebar-section-children"><a href="global.html#SpecialNumberType">SpecialNumberType</a></div><div class="sidebar-section-children"><a href="global.html#StdIoOptions">StdIoOptions</a></div><div class="sidebar-section-children"><a href="global.html#THENABLE_DRIVERS">THENABLE_DRIVERS</a></div><div class="sidebar-section-children"><a href="global.html#Transport">Transport</a></div><div class="sidebar-section-children"><a href="global.html#Type">Type</a></div><div class="sidebar-section-children"><a href="global.html#Type">Type</a></div><div class="sidebar-section-children"><a href="global.html#Type">Type</a></div><div class="sidebar-section-children"><a href="global.html#Type">Type</a></div><div class="sidebar-section-children"><a href="global.html#USER_AGENT">USER_AGENT</a></div><div class="sidebar-section-children"><a href="global.html#UserPromptHandler">UserPromptHandler</a></div><div class="sidebar-section-children"><a href="global.html#W3C_COMMAND_MAP">W3C_COMMAND_MAP</a></div><div class="sidebar-section-children"><a href="global.html#ableToSwitchToFrame">ableToSwitchToFrame</a></div><div class="sidebar-section-children"><a href="global.html#addConsoleHandler">addConsoleHandler</a></div><div class="sidebar-section-children"><a href="global.html#alertIsPresent">alertIsPresent</a></div><div class="sidebar-section-children"><a href="global.html#applyOverrides">applyOverrides</a></div><div class="sidebar-section-children"><a href="global.html#applyVendor">applyVendor</a></div><div class="sidebar-section-children"><a href="global.html#arraysEqual">arraysEqual</a></div><div class="sidebar-section-children"><a href="global.html#balancedBody">balancedBody</a></div><div class="sidebar-section-children"><a href="global.html#bazelJava">bazelJava</a></div><div class="sidebar-section-children"><a href="global.html#binaryPaths">binaryPaths</a></div><div class="sidebar-section-children"><a href="global.html#branchType">branchType</a></div><div class="sidebar-section-children"><a href="global.html#buildDefMap">buildDefMap</a></div><div class="sidebar-section-children"><a href="global.html#buildEmptyParamTypes">buildEmptyParamTypes</a></div><div class="sidebar-section-children"><a href="global.html#buildModel">buildModel</a></div><div class="sidebar-section-children"><a href="global.html#buildPath">buildPath</a></div><div class="sidebar-section-children"><a href="global.html#buildRequest">buildRequest</a></div><div class="sidebar-section-children"><a href="global.html#buildResultTypeNames">buildResultTypeNames</a></div><div class="sidebar-section-children"><a href="global.html#buildSpecHrefs">buildSpecHrefs</a></div><div class="sidebar-section-children"><a href="global.html#buildSpecLinks">buildSpecLinks</a></div><div class="sidebar-section-children"><a href="global.html#builtTargets">builtTargets</a></div><div class="sidebar-section-children"><a href="global.html#canonicalizeVariantParams">canonicalizeVariantParams</a></div><div class="sidebar-section-children"><a href="global.html#check">check</a></div><div class="sidebar-section-children"><a href="global.html#checkCodePoint">checkCodePoint</a></div><div class="sidebar-section-children"><a href="global.html#checkCompleteness">checkCompleteness</a></div><div class="sidebar-section-children"><a href="global.html#checkLegacyResponse">checkLegacyResponse</a></div><div class="sidebar-section-children"><a href="global.html#checkOptions">checkOptions</a></div><div class="sidebar-section-children"><a href="global.html#checkSchema">checkSchema</a></div><div class="sidebar-section-children"><a href="global.html#checkedCall">checkedCall</a></div><div class="sidebar-section-children"><a href="global.html#checkedNodeCall">checkedNodeCall</a></div><div class="sidebar-section-children"><a href="global.html#choiceBranches">choiceBranches</a></div><div class="sidebar-section-children"><a href="global.html#closeBidiConnection">closeBidiConnection</a></div><div class="sidebar-section-children"><a href="global.html#collectAllMembers">collectAllMembers</a></div><div class="sidebar-section-children"><a href="global.html#collectReferencedNames">collectReferencedNames</a></div><div class="sidebar-section-children"><a href="global.html#collectUnionMembers">collectUnionMembers</a></div><div class="sidebar-section-children"><a href="global.html#color">color</a></div><div class="sidebar-section-children"><a href="global.html#computeCrossDomainImports">computeCrossDomainImports</a></div><div class="sidebar-section-children"><a href="global.html#connections">connections</a></div><div class="sidebar-section-children"><a href="global.html#consoleHandler">consoleHandler</a></div><div class="sidebar-section-children"><a href="global.html#copy">copy</a></div><div class="sidebar-section-children"><a href="global.html#copyDir">copyDir</a></div><div class="sidebar-section-children"><a href="global.html#createConnection">createConnection</a></div><div class="sidebar-section-children"><a href="global.html#createDriver">createDriver</a></div><div class="sidebar-section-children"><a href="global.html#dedupeDefs">dedupeDefs</a></div><div class="sidebar-section-children"><a href="global.html#defineAlias">defineAlias</a></div><div class="sidebar-section-children"><a href="global.html#defineEnum">defineEnum</a></div><div class="sidebar-section-children"><a href="global.html#defineRecord">defineRecord</a></div><div class="sidebar-section-children"><a href="global.html#defineUnion">defineUnion</a></div><div class="sidebar-section-children"><a href="global.html#delayed">delayed</a></div><div class="sidebar-section-children"><a href="global.html#detectInlineVariant">detectInlineVariant</a></div><div class="sidebar-section-children"><a href="global.html#diffAgainstCddl2ts">diffAgainstCddl2ts</a></div><div class="sidebar-section-children"><a href="global.html#direct">direct</a></div><div class="sidebar-section-children"><a href="global.html#domainForTypeName">domainForTypeName</a></div><div class="sidebar-section-children"><a href="global.html#eachPropertyDeep">eachPropertyDeep</a></div><div class="sidebar-section-children"><a href="global.html#elementIsDisabled">elementIsDisabled</a></div><div class="sidebar-section-children"><a href="global.html#elementIsEnabled">elementIsEnabled</a></div><div class="sidebar-section-children"><a href="global.html#elementIsNotSelected">elementIsNotSelected</a></div><div class="sidebar-section-children"><a href="global.html#elementIsNotVisible">elementIsNotVisible</a></div><div class="sidebar-section-children"><a href="global.html#elementIsSelected">elementIsSelected</a></div><div class="sidebar-section-children"><a href="global.html#elementIsVisible">elementIsVisible</a></div><div class="sidebar-section-children"><a href="global.html#elementLocated">elementLocated</a></div><div class="sidebar-section-children"><a href="global.html#elementTextContains">elementTextContains</a></div><div class="sidebar-section-children"><a href="global.html#elementTextIs">elementTextIs</a></div><div class="sidebar-section-children"><a href="global.html#elementTextMatches">elementTextMatches</a></div><div class="sidebar-section-children"><a href="global.html#elementsLocated">elementsLocated</a></div><div class="sidebar-section-children"><a href="global.html#encodeError">encodeError</a></div><div class="sidebar-section-children"><a href="global.html#ensureFileDetectorsAreEnabled">ensureFileDetectorsAreEnabled</a></div><div class="sidebar-section-children"><a href="global.html#escapeCss">escapeCss</a></div><div class="sidebar-section-children"><a href="global.html#event">event</a></div><div class="sidebar-section-children"><a href="global.html#exec">exec</a></div><div class="sidebar-section-children"><a href="global.html#executeCommand">executeCommand</a></div><div class="sidebar-section-children"><a href="global.html#exists">exists</a></div><div class="sidebar-section-children"><a href="global.html#expectedUnionFields">expectedUnionFields</a></div><div class="sidebar-section-children"><a href="global.html#extractAnchors">extractAnchors</a></div><div class="sidebar-section-children"><a href="global.html#extractCommands">extractCommands</a></div><div class="sidebar-section-children"><a href="global.html#extractEvents">extractEvents</a></div><div class="sidebar-section-children"><a href="global.html#extractId">extractId</a></div><div class="sidebar-section-children"><a href="global.html#extractVendor">extractVendor</a></div><div class="sidebar-section-children"><a href="global.html#filter">filter</a></div><div class="sidebar-section-children"><a href="global.html#filterNonW3CCaps">filterNonW3CCaps</a></div><div class="sidebar-section-children"><a href="global.html#findFreePort">findFreePort</a></div><div class="sidebar-section-children"><a href="global.html#findInPath">findInPath</a></div><div class="sidebar-section-children"><a href="global.html#flattenGroupComposition">flattenGroupComposition</a></div><div class="sidebar-section-children"><a href="global.html#formatSpawnArgs">formatSpawnArgs</a></div><div class="sidebar-section-children"><a href="global.html#fromWireValue">fromWireValue</a></div><div class="sidebar-section-children"><a href="global.html#fullyResolveKeys">fullyResolveKeys</a></div><div class="sidebar-section-children"><a href="global.html#fullyResolved">fullyResolved</a></div><div class="sidebar-section-children"><a href="global.html#generateTypeDeclaration">generateTypeDeclaration</a></div><div class="sidebar-section-children"><a href="global.html#generateTypeScript">generateTypeScript</a></div><div class="sidebar-section-children"><a href="global.html#getAddress">getAddress</a></div><div class="sidebar-section-children"><a href="global.html#getAvailableBrowsers">getAvailableBrowsers</a></div><div class="sidebar-section-children"><a href="global.html#getBidiConnection">getBidiConnection</a></div><div class="sidebar-section-children"><a href="global.html#getBinary">getBinary</a></div><div class="sidebar-section-children"><a href="global.html#getBinaryPaths">getBinaryPaths</a></div><div class="sidebar-section-children"><a href="global.html#getBrowsersToTestFromEnv">getBrowsersToTestFromEnv</a></div><div class="sidebar-section-children"><a href="global.html#getBrowsingContextInstance">getBrowsingContextInstance</a></div><div class="sidebar-section-children"><a href="global.html#getHostName">getHostName</a></div><div class="sidebar-section-children"><a href="global.html#getIPAddress">getIPAddress</a></div><div class="sidebar-section-children"><a href="global.html#getJavaPath">getJavaPath</a></div><div class="sidebar-section-children"><a href="global.html#getLevel">getLevel</a></div><div class="sidebar-section-children"><a href="global.html#getLogInspectorInstance">getLogInspectorInstance</a></div><div class="sidebar-section-children"><a href="global.html#getLogger">getLogger</a></div><div class="sidebar-section-children"><a href="global.html#getLoopbackAddress">getLoopbackAddress</a></div><div class="sidebar-section-children"><a href="global.html#getRequestOptions">getRequestOptions</a></div><div class="sidebar-section-children"><a href="global.html#getStatus">getStatus</a></div><div class="sidebar-section-children"><a href="global.html#getTestHook">getTestHook</a></div><div class="sidebar-section-children"><a href="global.html#groupTypesByDomain">groupTypesByDomain</a></div><div class="sidebar-section-children"><a href="global.html#headersToString">headersToString</a></div><div class="sidebar-section-children"><a href="global.html#hoistInlineEnums">hoistInlineEnums</a></div><div class="sidebar-section-children"><a href="global.html#hoistInlineRecords">hoistInlineRecords</a></div><div class="sidebar-section-children"><a href="global.html#ignore">ignore</a></div><div class="sidebar-section-children"><a href="global.html#inheritedVendor">inheritedVendor</a></div><div class="sidebar-section-children"><a href="global.html#init">init</a></div><div class="sidebar-section-children"><a href="global.html#installConsoleHandler">installConsoleHandler</a></div><div class="sidebar-section-children"><a href="global.html#isErrorResponse">isErrorResponse</a></div><div class="sidebar-section-children"><a href="global.html#isFree">isFree</a></div><div class="sidebar-section-children"><a href="global.html#isGroupRef">isGroupRef</a></div><div class="sidebar-section-children"><a href="global.html#isId">isId</a></div><div class="sidebar-section-children"><a href="global.html#isIdle">isIdle</a></div><div class="sidebar-section-children"><a href="global.html#isInlineGroup">isInlineGroup</a></div><div class="sidebar-section-children"><a href="global.html#isLiteral">isLiteral</a></div><div class="sidebar-section-children"><a href="global.html#isNullArm">isNullArm</a></div><div class="sidebar-section-children"><a href="global.html#isObject">isObject</a></div><div class="sidebar-section-children"><a href="global.html#isPromise">isPromise</a></div><div class="sidebar-section-children"><a href="global.html#isRetryableNetworkError">isRetryableNetworkError</a></div><div class="sidebar-section-children"><a href="global.html#isSelenium3x">isSelenium3x</a></div><div class="sidebar-section-children"><a href="global.html#legacyTimeout">legacyTimeout</a></div><div class="sidebar-section-children"><a href="global.html#load">load</a></div><div class="sidebar-section-children"><a href="global.html#locate">locate</a></div><div class="sidebar-section-children"><a href="global.html#locateWith">locateWith</a></div><div class="sidebar-section-children"><a href="global.html#manual">manual</a></div><div class="sidebar-section-children"><a href="global.html#map">map</a></div><div class="sidebar-section-children"><a href="global.html#mkdir">mkdir</a></div><div class="sidebar-section-children"><a href="global.html#mkdirp">mkdirp</a></div><div class="sidebar-section-children"><a href="global.html#nameAllocator">nameAllocator</a></div><div class="sidebar-section-children"><a href="global.html#normalizeAst">normalizeAst</a></div><div class="sidebar-section-children"><a href="global.html#normalizeDottedName">normalizeDottedName</a></div><div class="sidebar-section-children"><a href="global.html#of">of</a></div><div class="sidebar-section-children"><a href="global.html#pac">pac</a></div><div class="sidebar-section-children"><a href="global.html#pad">pad</a></div><div class="sidebar-section-children"><a href="global.html#parseCddl2ts">parseCddl2ts</a></div><div class="sidebar-section-children"><a href="global.html#parseHttpResponse">parseHttpResponse</a></div><div class="sidebar-section-children"><a href="global.html#parseLeafDef">parseLeafDef</a></div><div class="sidebar-section-children"><a href="global.html#pascal">pascal</a></div><div class="sidebar-section-children"><a href="global.html#path">path</a></div><div class="sidebar-section-children"><a href="global.html#pinnedGridArgs">pinnedGridArgs</a></div><div class="sidebar-section-children"><a href="global.html#projectRecord">projectRecord</a></div><div class="sidebar-section-children"><a href="global.html#projectRoot">projectRoot</a></div><div class="sidebar-section-children"><a href="global.html#projectSchema">projectSchema</a></div><div class="sidebar-section-children"><a href="global.html#read">read</a></div><div class="sidebar-section-children"><a href="global.html#refsIn">refsIn</a></div><div class="sidebar-section-children"><a href="global.html#removeConsoleHandler">removeConsoleHandler</a></div><div class="sidebar-section-children"><a href="global.html#requireAtom">requireAtom</a></div><div class="sidebar-section-children"><a href="global.html#resolveAliasRuntime">resolveAliasRuntime</a></div><div class="sidebar-section-children"><a href="global.html#resolveCommandLineFlags">resolveCommandLineFlags</a></div><div class="sidebar-section-children"><a href="global.html#resolveInputPath">resolveInputPath</a></div><div class="sidebar-section-children"><a href="global.html#resolveWaitMessage">resolveWaitMessage</a></div><div class="sidebar-section-children"><a href="global.html#rmDir">rmDir</a></div><div class="sidebar-section-children"><a href="global.html#schemaToCommands">schemaToCommands</a></div><div class="sidebar-section-children"><a href="global.html#schemaToEvents">schemaToEvents</a></div><div class="sidebar-section-children"><a href="global.html#schemaTypeFields">schemaTypeFields</a></div><div class="sidebar-section-children"><a href="global.html#sendIndex">sendIndex</a></div><div class="sidebar-section-children"><a href="global.html#sendRequest">sendRequest</a></div><div class="sidebar-section-children"><a href="global.html#serialize">serialize</a></div><div class="sidebar-section-children"><a href="global.html#setFileDetector">setFileDetector</a></div><div class="sidebar-section-children"><a href="global.html#shouldRetryRequest">shouldRetryRequest</a></div><div class="sidebar-section-children"><a href="global.html#socks">socks</a></div><div class="sidebar-section-children"><a href="global.html#spliceExtensionGroups">spliceExtensionGroups</a></div><div class="sidebar-section-children"><a href="global.html#splitHostAndPort">splitHostAndPort</a></div><div class="sidebar-section-children"><a href="global.html#splitName">splitName</a></div><div class="sidebar-section-children"><a href="global.html#splitTopLevel">splitTopLevel</a></div><div class="sidebar-section-children"><a href="global.html#stalenessOf">stalenessOf</a></div><div class="sidebar-section-children"><a href="global.html#start">start</a></div><div class="sidebar-section-children"><a href="global.html#startSeleniumServer">startSeleniumServer</a></div><div class="sidebar-section-children"><a href="global.html#stat">stat</a></div><div class="sidebar-section-children"><a href="global.html#stop">stop</a></div><div class="sidebar-section-children"><a href="global.html#stripObjectBodies">stripObjectBodies</a></div><div class="sidebar-section-children"><a href="global.html#suite">suite</a></div><div class="sidebar-section-children"><a href="global.html#suite">suite</a></div><div class="sidebar-section-children"><a href="global.html#suiteBrowsers">suiteBrowsers</a></div><div class="sidebar-section-children"><a href="global.html#system">system</a></div><div class="sidebar-section-children"><a href="global.html#thenFinally">thenFinally</a></div><div class="sidebar-section-children"><a href="global.html#throwDecodedError">throwDecodedError</a></div><div class="sidebar-section-children"><a href="global.html#titleContains">titleContains</a></div><div class="sidebar-section-children"><a href="global.html#titleIs">titleIs</a></div><div class="sidebar-section-children"><a href="global.html#titleMatches">titleMatches</a></div><div class="sidebar-section-children"><a href="global.html#tmpDir">tmpDir</a></div><div class="sidebar-section-children"><a href="global.html#tmpFile">tmpFile</a></div><div class="sidebar-section-children"><a href="global.html#toExecuteAtomCommand">toExecuteAtomCommand</a></div><div class="sidebar-section-children"><a href="global.html#toMap">toMap</a></div><div class="sidebar-section-children"><a href="global.html#toWireValue">toWireValue</a></div><div class="sidebar-section-children"><a href="global.html#topLevelFields">topLevelFields</a></div><div class="sidebar-section-children"><a href="global.html#trimRedundantPrefix">trimRedundantPrefix</a></div><div class="sidebar-section-children"><a href="global.html#tryParse">tryParse</a></div><div class="sidebar-section-children"><a href="global.html#tsName">tsName</a></div><div class="sidebar-section-children"><a href="global.html#typeList">typeList</a></div><div class="sidebar-section-children"><a href="global.html#typeNodeToTs">typeNodeToTs</a></div><div class="sidebar-section-children"><a href="global.html#typeRefNames">typeRefNames</a></div><div class="sidebar-section-children"><a href="global.html#unionSelector">unionSelector</a></div><div class="sidebar-section-children"><a href="global.html#unlink">unlink</a></div><div class="sidebar-section-children"><a href="global.html#unzip">unzip</a></div><div class="sidebar-section-children"><a href="global.html#url">url</a></div><div class="sidebar-section-children"><a href="global.html#urlContains">urlContains</a></div><div class="sidebar-section-children"><a href="global.html#urlIs">urlIs</a></div><div class="sidebar-section-children"><a href="global.html#urlMatches">urlMatches</a></div><div class="sidebar-section-children"><a href="global.html#variantRecord">variantRecord</a></div><div class="sidebar-section-children"><a href="global.html#waitForServer">waitForServer</a></div><div class="sidebar-section-children"><a href="global.html#waitForUrl">waitForUrl</a></div><div class="sidebar-section-children"><a href="global.html#walkDir">walkDir</a></div><div class="sidebar-section-children"><a href="global.html#whereIs">whereIs</a></div><div class="sidebar-section-children"><a href="global.html#withTagName">withTagName</a></div><div class="sidebar-section-children"><a href="global.html#write">write</a></div></div></div></div></div><div class="navbar-container" id="VuAckcnZhf"><nav class="navbar"><div class="navbar-left-items"><div class="navbar-item"><a id="github" href="https://github.com/SeleniumHQ/selenium" target="">GitHub</a></div><div class="navbar-item"><a id="npm" href="https://www.npmjs.com/package/selenium-webdriver" target="">npm</a></div></div><div class="navbar-right-items"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#light-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div><nav></nav></nav></div><div class="toc-container"><div class="toc-content"><span class="bold">On this page</span><div id="eed4d2a0bfd64539bb9df78095dec881"></div></div></div><div class="body-wrapper"><div class="main-content"><div class="main-wrapper"><section id="source-page" class="source-page"><header><h1 id="title" class="has-anchor">generate_bidi.mjs</h1></header><article><pre class="prettyprint source lang-js"><code>// 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.
/**
* Generate the shared WebDriver BiDi artifacts and TypeScript bindings from a
* merged CDDL spec, as a three-stage pipeline — one stage per invocation:
*
* 1. parse --cddl &lt;f> --dump-ast &lt;f> CDDL → AST
* 2. model --ast &lt;f> --dump-model &lt;f> AST → command/event model
* 3. generate --ast &lt;f> --model &lt;f> --output-dir &lt;d> AST + model → one TS module per domain
* [--spec-version &lt;v>]
*/
import { parse } from 'cddl'
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
import { dirname, join, resolve } from 'node:path'
import { fileURLToPath } from 'node:url'
import { parseArgs } from 'node:util'
import { projectSchema } from './project_bidi_schema.mjs'
// ============================================================
// Domain configuration
// ============================================================
// Output filename for each domain key.
const DOMAIN_FILES = {
browser: 'browser.ts',
browsingContext: 'browsing_context.ts',
emulation: 'emulation.ts',
input: 'input.ts',
log: 'log.ts',
network: 'network.ts',
permissions: 'permissions.ts',
script: 'script.ts',
session: 'session.ts',
speculation: 'speculation.ts',
storage: 'storage.ts',
userAgentClientHints: 'user_agent_client_hints.ts',
webExtension: 'webextension.ts',
bluetooth: 'bluetooth.ts',
digitalCredentials: 'digital_credentials.ts',
common: 'common.ts',
}
// Implementation class name for each domain key.
// Domains absent from this map only receive type definitions (no class).
const DOMAIN_CLASSES = {
browser: 'Browser',
browsingContext: 'BrowsingContext',
emulation: 'Emulation',
input: 'Input',
log: 'Log',
network: 'Network',
permissions: 'Permissions',
script: 'Script',
session: 'Session',
speculation: 'Speculation',
storage: 'Storage',
userAgentClientHints: 'UserAgentClientHints',
webExtension: 'WebExtension',
bluetooth: 'Bluetooth',
digitalCredentials: 'DigitalCredentials',
}
// ============================================================
// Path helpers
// ============================================================
/**
* Resolve a path that came from a Bazel $(location …) expansion.
*
* When a js_binary runs inside a js_run_binary action Bazel sets BAZEL_BINDIR
* and the js_binary wrapper calls process.chdir(BAZEL_BINDIR) before handing
* control to the script. $(location) values are relative to the *execroot*,
* so they already contain the BAZEL_BINDIR prefix. Stripping that prefix
* makes them relative to the CWD, after which path.resolve() works correctly.
* Outside Bazel (BAZEL_BINDIR unset) paths are resolved normally.
*/
function resolveInputPath(p) {
if (!p) return null
if (!process.env.BAZEL_BINDIR) return resolve(p)
// Normalize both strings to forward slashes before prefix-stripping so that
// mixed separators on Windows (BAZEL_BINDIR uses '\', $(location) uses '/')
// do not cause the startsWith check to silently fail.
const normalizedP = p.replaceAll('\\', '/')
const normalizedBindir = process.env.BAZEL_BINDIR.replaceAll('\\', '/')
const prefix = normalizedBindir + '/'
return resolve(normalizedP.startsWith(prefix) ? normalizedP.slice(prefix.length) : normalizedP)
}
// ============================================================
// Main
// ============================================================
async function main() {
const { values: args } = parseArgs({
options: {
cddl: { type: 'string', multiple: true },
'override-cddl': { type: 'string', multiple: true },
'vendor-cddl': { type: 'string', multiple: true },
ast: { type: 'string' },
model: { type: 'string' },
'dump-ast': { type: 'string' },
'dump-model': { type: 'string' },
'output-dir': { type: 'string' },
'spec-version': { type: 'string', default: '1.0' },
},
})
// One pipeline stage per invocation; the flags select the stage.
if (args['dump-ast'] &amp;&amp; args.cddl?.length) {
// The base spec is several CDDL files (webdriver-bidi + the adjacent specs); each
// is parsed independently and their definitions concatenated. Top-level CDDL
// productions are position-independent (refs resolve by name later), so this equals
// parsing one merged file — without a separate merge step or tool. Spec-shaped Selenium
// overrides are applied here; vendor overlays are NOT, so this base AST —
// which feeds the model and the browser-neutral TypeScript binding — stays vendor-free.
const baseAst = args.cddl.flatMap(parseCddl)
writeJson(args['dump-ast'], applyOverrides(baseAst, args['override-cddl'] ?? []), 'ast')
} else if (args['dump-ast'] &amp;&amp; args.ast &amp;&amp; args['vendor-cddl']?.length) {
// The base AST plus vendor overlays, consumed ONLY by the schema projector. Applying vendor
// on this separate path (rather than into the shared base AST) is what keeps the tagged
// vendor fields out of cddl2ts and the model — the schema step segregates them into `vendor`.
writeJson(args['dump-ast'], applyVendor(readJson(args.ast, 'AST'), args['vendor-cddl']), 'ast')
} else if (args['dump-model'] &amp;&amp; args.ast) {
writeJson(args['dump-model'], buildModel(readJson(args.ast, 'AST')), 'model', true)
} else if (args['output-dir'] &amp;&amp; args.ast &amp;&amp; args.model) {
generateTypeScript(readJson(args.ast, 'AST'), readJson(args.model, 'model'), args)
} else {
console.error(
'Usage (one stage per invocation):\n' +
' generate_bidi.mjs --cddl &lt;file> [--cddl &lt;file>...] [--override-cddl &lt;file>...] --dump-ast &lt;file>\n' +
' generate_bidi.mjs --ast &lt;file> --vendor-cddl &lt;namespace>=&lt;file> [...] --dump-ast &lt;file>\n' +
' generate_bidi.mjs --ast &lt;file> --dump-model &lt;file>\n' +
' generate_bidi.mjs --ast &lt;file> --model &lt;file> --output-dir &lt;dir> [--spec-version &lt;v>]',
)
process.exit(1)
}
}
function parseCddl(cddlArg) {
const cddlPath = resolveInputPath(cddlArg)
if (!existsSync(cddlPath)) {
console.error(`Error: CDDL file not found: ${cddlPath}`)
process.exit(1)
}
console.log(`Parsing CDDL: ${cddlPath}`)
const ast = parse(cddlPath)
console.log(` ${ast.length} top-level definitions`)
return ast
}
/**
* Apply Selenium overlay CDDL (see common/bidi/) to the parsed upstream AST: any
* production an overlay defines replaces the identically named upstream one, which is
* dropped. Kept here rather than in the shared CDDL merge so the overlay is a
* schema-generation concern only — the upstream grammars other bindings consume are
* untouched. Overlay defs are appended so downstream normalization treats them like
* any other definition.
*/
function applyOverrides(ast, overrideArgs) {
if (!overrideArgs.length) return ast
const overrides = overrideArgs.flatMap((arg) => parseCddl(arg))
const names = new Set(overrides.filter((d) => d?.Name).map((d) => d.Name))
return [...ast.filter((d) => !(d?.Name &amp;&amp; names.has(d.Name))), ...overrides]
}
/**
* Apply Selenium vendor overlay CDDL (see common/bidi/*-extensions.cddl) to the AST. Each
* `--vendor-cddl` is `&lt;namespace>=&lt;file>`, the namespace being the wire prefix the vendor owns
* (`moz` for `moz:` fields). A vendor overlay extends a spec type through a `&lt;Type>Extension`
* group of typed browser-specific fields, which the normalizer splices into the like-named
* upstream record. Unlike a plain override, every field a vendor overlay contributes is tagged
* with its provenance — the namespace and the extension group it flows through — so the
* projector can resolve it against the real spec type (the merge genuinely happens) yet route it
* out of the shared, browser-neutral schema into a separate `vendor` section.
*/
function applyVendor(ast, vendorArgs) {
if (!vendorArgs.length) return ast
const specGroups = new Set(ast.filter((d) => d?.Type === 'group').map((d) => d.Name))
const vendorDefs = vendorArgs.flatMap((arg) => {
const [namespace, file] = splitVendorArg(arg)
return tagVendorDefs(parseCddl(file), namespace, specGroups)
})
return [...ast, ...vendorDefs]
}
function splitVendorArg(arg) {
const i = arg.indexOf('=')
if (i &lt;= 0) {
console.error(`Error: --vendor-cddl expects &lt;namespace>=&lt;file>, got: ${arg}`)
process.exit(1)
}
return [arg.slice(0, i), arg.slice(i + 1)]
}
const EXTENSION_SUFFIX = 'Extension'
// Classify each vendor def and stamp the provenance the projector partitions on. A def named
// `&lt;Type>Extension` where `&lt;Type>` is a spec group is an extension group in the convention
// Mozilla's `Extensions.md` documents (read "as if included in that type"): the def is tagged
// with the type it extends (`x-selenium-vendor-extends`, which the normalizer splices on) and
// each field with `x-selenium-vendor` (namespace) and `x-selenium-vendor-via` (the group) —
// the fields are what flow into the shared type. A `&lt;Type>Extension` with no such spec group
// is a mistake, not a helper type, so it fails loudly. Any other def (a helper type an
// extension field references) is tagged on the def itself and stays whole.
function tagVendorDefs(defs, namespace, specGroups) {
for (const def of defs) {
if (!def?.Name) continue
if (!def.Name.endsWith(EXTENSION_SUFFIX)) {
def['x-selenium-vendor'] = namespace
continue
}
const target = def.Name.slice(0, -EXTENSION_SUFFIX.length)
if (!specGroups.has(target)) {
console.error(`Error: vendor extension group ${def.Name} (${namespace}) has no spec type ${target} to extend`)
process.exit(1)
}
def['x-selenium-vendor-extends'] = target
for (const p of (def.Properties ?? []).flat()) {
if (!p || typeof p !== 'object' || !p.Name) continue
p['x-selenium-vendor'] = namespace
p['x-selenium-vendor-via'] = def.Name
}
}
return defs
}
function readJson(fileArg, label) {
const path = resolveInputPath(fileArg)
if (!existsSync(path)) {
console.error(`Error: ${label} file not found: ${path}`)
process.exit(1)
}
return JSON.parse(readFileSync(path, 'utf8'))
}
function writeJson(fileArg, data, label, pretty = false) {
const out = resolve(fileArg)
writeFileSync(out, pretty ? JSON.stringify(data, null, 2) + '\n' : JSON.stringify(data), 'utf8')
console.log(` → ${out} (${label})`)
}
/** Emit one TS module per domain: types and commands/events, both from bidi_schema.json. */
function generateTypeScript(ast, model, args) {
const outputDir = resolve(args['output-dir'])
const specVersion = args['spec-version']
const unmapped = Object.keys(model).filter((d) => !(d in DOMAIN_FILES))
if (unmapped.length) {
throw new Error(`model domains without a DOMAIN_FILES/DOMAIN_CLASSES entry: ${unmapped.join(', ')}`)
}
console.log('Projecting the binding-neutral schema…')
const schema = projectSchema(ast, model)
console.log(
` ${schema.commands.length} commands, ${schema.events.length} events, ${Object.keys(schema.types).length} types`,
)
const typesByDomain = groupTypesByDomain(schema.types)
const allCommands = schemaToCommands(schema)
const allEvents = schemaToEvents(schema)
mkdirSync(outputDir, { recursive: true })
for (const [domainKey, filename] of Object.entries(DOMAIN_FILES)) {
const types = typesByDomain[domainKey] ?? {}
const commands = allCommands.filter((c) => c.domain === domainKey)
const events = allEvents.filter((e) => e.domain === domainKey)
const className = DOMAIN_CLASSES[domainKey]
const content = generateDomainFile({
domain: domainKey,
className,
types,
commands,
events,
specVersion,
})
const outPath = join(outputDir, filename)
writeFileSync(outPath, content, 'utf8')
console.log(` → ${outPath}`)
}
console.log('Done.')
}
// ============================================================
// Schema-derived domain grouping
// ============================================================
/** A schema type name's domain segment, e.g. 'network.AddIntercept' -> 'network'. */
function domainForTypeName(name) {
const dotIdx = name.indexOf('.')
if (dotIdx === -1) return 'common'
const domain = name.slice(0, dotIdx)
return Object.hasOwn(DOMAIN_FILES, domain) ? domain : 'common'
}
/** Groups the schema's flat `types` map into `{ domain: { typeName: node } }`. */
function groupTypesByDomain(types) {
const result = {}
for (const [name, node] of Object.entries(types)) {
const domain = domainForTypeName(name)
;(result[domain] ??= {})[name] = node
}
return result
}
// ============================================================
// Pass 2: AST analysis
// ============================================================
/**
* Returns the set of group names that carry no named parameters.
* This includes truly empty groups AND groups whose only properties are
* anonymous inclusions (e.g. `EmptyParams = { Extensible }`) — those are
* extensibility markers with no protocol fields of their own.
*/
function buildEmptyParamTypes(ast) {
const empty = new Set()
for (const def of ast) {
if (def.Type !== 'group' || !Array.isArray(def.Properties)) continue
const flat = def.Properties.flatMap((p) => (Array.isArray(p) ? p : [p]))
const hasNamedProp = flat.some((p) => p.Name &amp;&amp; p.Name !== '')
if (!hasNamedProp) empty.add(def.Name)
}
return empty
}
/**
* Convert a dotted CDDL name to PascalCase TypeScript name.
* "browsingContext.Info" → "BrowsingContextInfo"
*/
function normalizeDottedName(name) {
return name
.split('.')
.map((part) =>
// A schema name segment may itself be hyphenated (e.g. the CDDL prelude
// range aliases 'js-uint'/'js-int'), which isn't a valid TS identifier
// character — split on '-' too so each word gets its own PascalCase turn.
part
.split('-')
.map((word) => {
const titled = word.charAt(0).toUpperCase() + word.slice(1)
// Normalize acronym runs to match cddl2ts output:
// CSPParameters → CspParameters HTMLCollection → HtmlCollection
// Rule: 2+ uppercase letters followed by an uppercase+lowercase pair (or end
// of string) → keep only the first uppercase and lowercase the rest.
return titled.replace(/([A-Z]{2,})(?=[A-Z][a-z]|$)/g, (m) => m[0] + m.slice(1).toLowerCase())
})
.join(''),
)
.join('')
}
/**
* Walk the `CommandData` or `EventData` union type hierarchy and collect all
* leaf definition names (the actual command/event group names).
*
* The CDDL AST represents union groups with Properties that can be:
* - An array of choice objects (each with a Type.Value pointing to the next level)
* - A single property object with Type as an array or direct object
*
* A leaf is a definition that itself has a `method` property (string literal).
*/
function collectUnionMembers(rootName, defMap, visited = new Set()) {
if (visited.has(rootName)) return new Set()
visited.add(rootName)
const def = defMap.get(rootName)
if (!def) return new Set()
const members = new Set()
// Flatten Properties — each element is either a choice-array or a property object. A one-member
// aggregate (`MozCommand = webExtension.MozListExtensions`) parses as a variable holding a PropertyType.
const rawProps = def.Properties ?? (def.Type === 'variable' ? [{ Type: def.PropertyType }] : [])
const allChoices = []
for (const prop of rawProps) {
if (Array.isArray(prop)) {
allChoices.push(...prop)
} else {
allChoices.push(prop)
}
}
for (const choice of allChoices) {
// choice.Type can be a single object or an array of type alternatives.
const typeEntries = Array.isArray(choice.Type) ? choice.Type : [choice.Type]
for (const entry of typeEntries) {
if (entry?.Type !== 'group' || !entry.Value) continue
const childName = entry.Value
const childDef = defMap.get(childName)
if (!childDef) continue
// A leaf has a `method` property — it is the actual command or event definition.
const childProps = childDef.Properties ?? []
const flat = childProps.flatMap((p) => (Array.isArray(p) ? p : [p]))
if (flat.some((p) => p.Name === 'method')) {
members.add(childName)
} else {
// Intermediate union — recurse.
for (const m of collectUnionMembers(childName, defMap, visited)) {
members.add(m)
}
}
}
}
return members
}
/**
* Build a name → definition map from the AST (deduplicated — first wins).
*/
function buildDefMap(ast) {
const map = new Map()
for (const def of ast) {
if (def.Name &amp;&amp; !map.has(def.Name)) map.set(def.Name, def)
}
return map
}
/** Extract {domain, methodStr, operationName, paramsCddl} from a command/event leaf def. */
function parseLeafDef(def) {
const flatProps = (def.Properties ?? []).flatMap((p) => (Array.isArray(p) ? p : [p]))
const methodProp = flatProps.find((p) => p.Name === 'method')
const paramsProp = flatProps.find((p) => p.Name === 'params')
if (!methodProp || !paramsProp) return null
const methodLiteral = Array.isArray(methodProp.Type) ? methodProp.Type : [methodProp.Type]
if (methodLiteral[0]?.Type !== 'literal') return null
const methodStr = methodLiteral[0].Value // e.g. "browser.createUserContext"
const dotIdx = methodStr.indexOf('.')
if (dotIdx === -1) return null
const domain = methodStr.slice(0, dotIdx)
const operationName = methodStr.slice(dotIdx + 1)
// A vendor leaf (tagged by tagVendorDefs) carries its namespace into the model.
const vendor = def['x-selenium-vendor']
const paramsTypeEntries = Array.isArray(paramsProp.Type) ? paramsProp.Type : [paramsProp.Type]
let paramsCddl = null
if (paramsTypeEntries[0]?.Type === 'group' &amp;&amp; paramsTypeEntries[0]?.Value) {
paramsCddl = paramsTypeEntries[0].Value
}
return { domain, methodStr, operationName, paramsCddl, vendor }
}
/**
* Collect all leaf command/event names from every XxxCommand / XxxEvent
* union that can be reached from either the core BiDi root (`CommandData` /
* `EventData`) or from extension-spec roots (e.g. `PermissionsCommand`,
* `SpeculationEvent`). Extension specs are not wired into `CommandData` /
* `EventData` inside the core BiDi CDDL, so a second pass is required.
*/
function collectAllMembers(defMap, rootSuffix) {
const members = new Set()
// Primary traversal from the core BiDi root.
const rootName = rootSuffix === 'Command' ? 'CommandData' : 'EventData'
for (const m of collectUnionMembers(rootName, defMap)) members.add(m)
// Secondary traversal: pick up any XxxCommand / XxxEvent unions in
// extension specs whose members were not already found above.
for (const [name, def] of defMap) {
if (!name.endsWith(rootSuffix) || name === rootName) continue
if (def.Type !== 'variable' &amp;&amp; def.Type !== 'group') continue
for (const m of collectUnionMembers(name, defMap)) members.add(m)
}
return members
}
/** Extract all BiDi commands by traversing CommandData and extension XxxCommand unions. */
function extractCommands(ast) {
const defMap = buildDefMap(ast)
const emptyParamTypes = buildEmptyParamTypes(ast)
const commandNames = collectAllMembers(defMap, 'Command')
const commands = []
for (const name of commandNames) {
const def = defMap.get(name)
if (!def) continue
const parsed = parseLeafDef(def)
if (!parsed) continue
const { domain, methodStr, operationName: methodName, paramsCddl, vendor } = parsed
// emptyParamTypes holds raw CDDL group names, so compare the raw name (not the normalized one).
const hasParams = paramsCddl !== null &amp;&amp; !emptyParamTypes.has(paramsCddl)
commands.push({
domain,
cddlName: name,
methodStr,
methodName,
paramsCddl,
hasParams,
vendor,
})
}
return commands
}
/** Extract all BiDi events by traversing EventData and extension XxxEvent unions. */
function extractEvents(ast) {
const defMap = buildDefMap(ast)
const eventNames = collectAllMembers(defMap, 'Event')
const events = []
for (const name of eventNames) {
const def = defMap.get(name)
if (!def) continue
const parsed = parseLeafDef(def)
if (!parsed) continue
const { domain, methodStr, operationName: eventName, paramsCddl, vendor } = parsed
events.push({
domain,
methodStr,
eventName,
paramsCddl,
vendor,
})
}
return events
}
// ============================================================
// Binding-neutral model
// ============================================================
/**
* Build the binding-neutral model from the AST. Type refs are CDDL names.
* Shape per domain key:
* { commands: [{ method, name, params, result }],
* events: [{ method, name, params }] }
* `params`/`result` are null when there are no params / no return value.
*/
function buildModel(ast) {
const model = {}
const resultTypes = buildResultTypeNames(ast)
const ensure = (domain) => (model[domain] ??= { commands: [], events: [] })
// A vendor entry carries its namespace so the schema projector can file it under
// `vendor.&lt;namespace>`; spec entries carry none, so a vendor-free AST yields the same model.
const provenance = (entry) => (entry.vendor ? { vendor: entry.vendor } : {})
for (const c of extractCommands(ast)) {
const result = c.cddlName + 'Result'
ensure(c.domain).commands.push({
method: c.methodStr,
name: c.methodName,
params: c.hasParams ? c.paramsCddl : null,
result: resultTypes.has(result) ? result : null,
...provenance(c),
})
}
for (const e of extractEvents(ast)) {
ensure(e.domain).events.push({
method: e.methodStr,
name: e.eventName,
params: e.paramsCddl || null,
...provenance(e),
})
}
return model
}
/** Result type names the spec defines with a value; an absent or `EmptyResult`-aliased result is void. */
function buildResultTypeNames(ast) {
const emptyAlias = new Set()
for (const d of ast) {
const pt = d.PropertyType
if (d.Name &amp;&amp; d.Type === 'variable' &amp;&amp; Array.isArray(pt) &amp;&amp; pt.length === 1 &amp;&amp; pt[0]?.Value === 'EmptyResult') {
emptyAlias.add(d.Name)
}
}
const names = new Set()
for (const d of ast) {
if (d.Name &amp;&amp; d.Name.endsWith('Result') &amp;&amp; !emptyAlias.has(d.Name)) names.add(d.Name)
}
return names
}
/** Map the schema's commands to the generator's command-entry shape. */
function schemaToCommands(schema) {
return schema.commands.map((c) => ({
domain: c.domain,
methodStr: c.method,
methodName: c.name,
paramsTypeName: c.params ? normalizeDottedName(c.params.ref) : null,
hasParams: c.params !== null,
resultTypeName: c.result ? normalizeDottedName(c.result.ref) : null,
}))
}
/** Map the schema's events to the generator's event-entry shape. */
function schemaToEvents(schema) {
return schema.events.map((e) => ({
domain: e.domain,
methodStr: e.method,
eventName: e.name,
paramsTypeName: e.params ? normalizeDottedName(e.params.ref) : null,
}))
}
// ============================================================
// Code generation
// ============================================================
// Shared license + note text, copied next to this script by BUILD.bazel — see scripts/*.txt.
const GENERATOR_DIR = dirname(fileURLToPath(import.meta.url))
const commentLines = (text) =>
text
.split('\n')
.map((line) => `// ${line}`.trimEnd())
.join('\n')
const LICENSE_HEADER = commentLines(readFileSync(join(GENERATOR_DIR, 'license_header.txt'), 'utf8').replace(/\n$/, ''))
const GENERATED_NOTE = commentLines(
readFileSync(join(GENERATOR_DIR, 'generated_note_template.txt'), 'utf8')
.replace('{generator}', 'javascript/selenium-webdriver/generate_bidi.mjs')
.replace('{command}', 'bazel build //javascript/selenium-webdriver:create-bidi-src')
.trim(),
)
// ============================================================
// Schema type node -> TypeScript, and cross-domain imports
// ============================================================
const PRIMITIVE_TS = { string: 'string', integer: 'number', number: 'number', boolean: 'boolean', null: 'null' }
/** Converts a schema type-ref node into a TypeScript type expression. */
function typeNodeToTs(node) {
if (!node) return 'unknown'
let base
if (node.primitive !== undefined) {
base = PRIMITIVE_TS[node.primitive] ?? 'unknown'
} else if (node.const !== undefined) {
base = JSON.stringify(node.const)
} else if (node.ref !== undefined) {
base = normalizeDottedName(node.ref)
} else if (node.enum !== undefined) {
base = node.enum.map((v) => JSON.stringify(v)).join(' | ')
} else if (node.list !== undefined) {
base = `Array&lt;${typeNodeToTs(node.list)}>`
} else if (node.map !== undefined) {
base = `Record&lt;string, ${typeNodeToTs(node.map)}>`
} else if (node.union !== undefined) {
base = node.union.map((v) => typeNodeToTs(v)).join(' | ')
} else {
base = 'unknown'
}
return node.nullable ? `${base} | null` : base
}
/** The type-name refs a projected ref node points at (list/map/union recurse). */
function refsIn(node) {
if (!node) return []
if (node.ref) return [node.ref]
if (node.list) return refsIn(node.list)
if (node.map) return refsIn(node.map)
if (node.union) return node.union.flatMap(refsIn)
return []
}
/** The type-name refs a type *node* (record/union/alias) points at. */
function typeRefNames(node) {
if (node.kind === 'record') {
const refs = node.fields.flatMap((f) => refsIn(f.type))
if (node.map) refs.push(...refsIn(node.map))
return refs
}
if (node.kind === 'union') return node.variants
if (node.kind === 'alias') return refsIn(node.type)
return []
}
/**
* Import statements for every other-domain type this domain's types reference: a
* type-only import for the TS names themselves, plus a plain side-effect import of
* the same module. The type-only import is erased at compile time (it exists purely
* for `tsc`), so it registers nothing at runtime — a caller who only imports, say,
* `session.js` would never actually load `browsing_context.js`, leaving every
* `browsingContext.*` type unregistered in the shared runtime registry (registry.js)
* and silently skipping deep validation for any field that refs one (see
* validateValue()'s `if (referenced === undefined) return value` in record.js).
* The side-effect import forces that module to load — and therefore register its
* types — regardless of whether this domain is used standalone. Safe even when two
* domains reference each other (e.g. session &lt;-> browsingContext): CommonJS resolves
* a require() cycle by returning the other module's not-yet-complete exports, but a
* bare side-effect import binds nothing, and no type here is read at define time
* anyway — resolution happens lazily, at validation time (registry.js), by which
* point both modules have finished loading.
*/
function computeCrossDomainImports(types, domain) {
const bySourceDomain = new Map()
for (const node of Object.values(types)) {
for (const ref of typeRefNames(node)) {
const sourceDomain = domainForTypeName(ref)
if (sourceDomain === domain) continue
if (!bySourceDomain.has(sourceDomain)) bySourceDomain.set(sourceDomain, new Set())
bySourceDomain.get(sourceDomain).add(normalizeDottedName(ref))
}
}
const imports = []
for (const [sourceDomain, names] of [...bySourceDomain.entries()].sort()) {
const sourceFile = DOMAIN_FILES[sourceDomain].replace('.ts', '.js')
imports.push(`import type { ${[...names].sort().join(', ')} } from './${sourceFile}'`)
imports.push(`import './${sourceFile}'`)
}
return imports
}
/**
* Emits one schema type's TS declaration plus the runtime call that registers
* it for validation — see bidi/serialization/{record,enum,union}.js. Returns
* the runtime binding's own name and kind too, so a command method in the
* same domain can reference it directly (e.g. to validate its params before
* sending, or parse its result via fromWire()) rather than only reaching
* nested/cross-domain refs indirectly through the shared registry.
*/
function generateTypeDeclaration(name, node) {
const tsName = normalizeDottedName(name)
if (node.kind === 'enum') {
const runtimeName = `${tsName}Enum`
const literal = node.values.map((v) => JSON.stringify(v)).join(' | ')
const ts = [
`export type ${tsName} = ${literal}`,
`const ${runtimeName} = defineEnum&lt;${tsName}>('${name}', ${JSON.stringify(node.values)})`,
].join('\n')
return { ts, runtimeName, kind: 'enum' }
}
if (node.kind === 'alias') {
const ts = [
`export type ${tsName} = ${typeNodeToTs(node.type)}`,
`defineAlias('${name}', ${JSON.stringify(node.type)})`,
].join('\n')
return { ts, runtimeName: null, kind: 'alias' }
}
if (node.kind === 'record') {
// No suffix: an interface and a const may share one name in TS (they live in
// separate type/value spaces, and only the const survives compilation to JS) —
// verified this compiles clean. Two names for one concept was self-inflicted
// confusion, not a real requirement; Ruby's generator uses one name too.
const runtimeName = tsName
const lines = [`export interface ${tsName} {`]
for (const field of node.fields) {
// Tolerating a missing required field's absence is no longer required —
// fromWire() now rejects a missing required field the same as any other
// invalid value, so a required field is always present, nullable or not.
const optional = !field.required
lines.push(` ${field.name}${optional ? '?' : ''}: ${typeNodeToTs(field.type)}`)
}
lines.push(`}`)
const optionsArg = node.extensible ? `, ${JSON.stringify({ extensible: true })}` : ''
lines.push(`const ${runtimeName} = defineRecord&lt;${tsName}>('${name}', ${JSON.stringify(node.fields)}${optionsArg})`)
return { ts: lines.join('\n'), runtimeName, kind: 'record' }
}
if (node.kind === 'union') {
const runtimeName = `${tsName}Union`
const memberNames = node.variants.map((v) => normalizeDottedName(v))
const options = {}
if (node.objectOnly) options.objectOnly = true
const optionsArg = Object.keys(options).length ? `, ${JSON.stringify(options)}` : ''
const ts = [
`export type ${tsName} = ${memberNames.join(' | ')}`,
`const ${runtimeName} = defineUnion&lt;${tsName}>('${name}', ${JSON.stringify(node.selector)}${optionsArg})`,
].join('\n')
return { ts, runtimeName, kind: 'union' }
}
return { ts: `export type ${tsName} = unknown`, runtimeName: null, kind: 'unknown' }
}
/**
* Follows an alias chain (an alias can point at another alias) to the record/union
* it ultimately resolves to, within `types` — one domain's own type map, the same
* shape generateDomainFile already has, so this needs no extra generator plumbing.
* Only a same-domain target is resolvable this way: a cross-domain alias (by far the
* most common case — `-> EmptyResult`, used across every domain) would need the target's
* runtime binding imported as a *value*, not just a type, from another domain's compiled
* file — real plumbing this doesn't attempt. Left unresolved there deliberately: EmptyResult
* has no required fields, so an unchecked cast catches nothing a fromWire() call would
* have caught either way — there's no actual validation gap to close for that case, only
* for a same-domain alias to a record/union that has real fields (or variants) to check.
* @returns {{runtimeName: string, kind: 'record'|'union'}|null}
*/
function resolveAliasRuntime(node, types) {
const seen = new Set()
let current = node
while (current?.kind === 'alias' &amp;&amp; current.type?.ref &amp;&amp; !seen.has(current.type.ref)) {
seen.add(current.type.ref)
const targetName = current.type.ref
const target = types[targetName]
if (target === undefined) return null // not in this domain — cross-domain, left unresolved
if (target.kind === 'record') return { runtimeName: normalizeDottedName(targetName), kind: 'record' }
if (target.kind === 'union') return { runtimeName: `${normalizeDottedName(targetName)}Union`, kind: 'union' }
current = target // another alias — keep resolving
}
return null
}
function generateDomainFile({ domain, className, types, commands, events, specVersion }) {
const parts = [LICENSE_HEADER, '', GENERATED_NOTE]
parts.push(`// Built from the WebDriver BiDi CDDL spec (v${specVersion}).`)
parts.push(`// Source: https://github.com/w3c/webref/tree/main/ed/cddl`)
parts.push('')
const hasImplementation = className != null &amp;&amp; (commands.length > 0 || events.length > 0)
const typeEntries = Object.entries(types)
const crossDomainImports = computeCrossDomainImports(Object.fromEntries(typeEntries), domain)
if (crossDomainImports.length > 0) {
for (const line of crossDomainImports) parts.push(line)
parts.push('')
}
if (typeEntries.length > 0) {
parts.push(`import { defineRecord, defineAlias } from '../serialization/record.js'`)
parts.push(`import { defineEnum } from '../serialization/enum.js'`)
parts.push(`import { defineUnion } from '../serialization/union.js'`)
parts.push('')
}
if (hasImplementation) {
// Domain.connect(driver) reaches the one BiDi connection for `driver`
// through the real internal accessor (never the deprecated driver.getBidi()).
parts.push(`import { Domain, event, type EventDescriptor, DOMAIN_TOKEN } from '../domain.js'`)
parts.push('')
}
// tsName -> {runtimeName, kind, fields?}, so a command method in this same file
// can validate its own params/result directly (rather than only reaching
// nested/cross-domain refs indirectly through the shared registry) and document
// each params field in its JSDoc from the same field list, not a second copy.
const runtimeByTsName = new Map()
// Enum constants owned by this domain, exposed as a discoverable static property
// on the domain class (or a top-level export when there's no class to attach to) —
// e.g. Network.SameSite = { STRICT: 'strict', ... }, mirroring how Ruby's generator
// exposes Network::SAME_SITE as a real, inspectable constant rather than a bare string.
const enumConstants = []
if (typeEntries.length > 0) {
parts.push(`// --- Types ---`)
parts.push('')
for (const [name, node] of typeEntries) {
const declared = generateTypeDeclaration(name, node)
const tsName = normalizeDottedName(name)
if (declared.runtimeName) {
runtimeByTsName.set(tsName, {
runtimeName: declared.runtimeName,
kind: declared.kind,
fields: node.kind === 'record' ? node.fields : undefined,
})
} else if (declared.kind === 'alias') {
// An alias itself has no RecordClass/UnionClass of its own (declared.runtimeName
// is null, see generateTypeDeclaration) — but when it ultimately points at a
// same-domain record/union, a command whose result *is* that alias (e.g.
// browser.CreateUserContextResult -> browser.UserContextInfo) should still
// validate inbound through fromWire(), not silently cast an unchecked response.
// Resolved by naming convention (a record's runtime const is its own tsName; a
// union's is `${tsName}Union`), not by depending on the target having already
// been processed — types is a complete map regardless of iteration order.
const resolved = resolveAliasRuntime(node, types)
if (resolved) runtimeByTsName.set(tsName, { ...resolved, fields: undefined })
}
if (declared.kind === 'enum') {
enumConstants.push({ propertyName: localSchemaName(name, tsName), values: node.values })
}
parts.push(declared.ts)
parts.push('')
}
}
if (!hasImplementation &amp;&amp; enumConstants.length > 0) {
parts.push(`// --- Enum constants ---`)
parts.push('')
for (const { propertyName, values } of enumConstants) {
parts.push(`export const ${propertyName} = ${generateEnumConstantLiteral(values)}`)
}
parts.push('')
}
if (hasImplementation) {
parts.push(`// --- Implementation ---`)
parts.push('')
parts.push(
generateClass({
className,
commands,
events,
runtimeByTsName,
enumConstants,
}),
)
}
return parts.join('\n') + '\n'
}
// Disclaimer attached to every generated class — matches Java's BiDiGenerator.
const INTERNAL_API_DOC = [
'/**',
' * This is an unsupported API. No compatibility guarantees are provided.',
' * It tracks the W3C WebDriver BiDi specification directly. As the specification',
' * evolves, this API will change or be removed without prior notice.',
' */',
].join('\n')
// camelCase -> SCREAMING_SNAKE_CASE, for event descriptor constant names
// ("beforeRequestSent" -> "BEFORE_REQUEST_SENT") and enum constant keys
// ("beforeRequestSent" -> "BEFORE_REQUEST_SENT", "strict" -> "STRICT").
function screamingSnakeCase(camel) {
return camel.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toUpperCase()
}
// The un-prefixed local segment of a dotted schema name, PascalCased —
// 'network.InterceptPhase' -> 'InterceptPhase'. Used for a static enum constant's
// property name on its owning domain class, where the class already implies the
// domain (Network.InterceptPhase, not Network.NetworkInterceptPhase).
function localSchemaName(name, tsNameFallback) {
const dotIdx = name.indexOf('.')
return dotIdx === -1 ? tsNameFallback : normalizeDottedName(name.slice(dotIdx + 1))
}
// A valid JS identifier for an enum constant's key, derived from its wire value.
// Unlike event/method names (always clean camelCase), some enum values are
// space- or hyphen-separated (error.ErrorCode: "invalid argument", emulation.
// ScreenOrientationType: "portrait-primary") or start with a character no JS
// identifier can (script.SpecialNumber: "-0", "-Infinity") — normalize those
// separators to underscores, and guard a still-invalid leading digit, before
// screamingSnakeCase's uppercasing, so every generated key actually parses.
function enumConstantKey(value) {
const key = screamingSnakeCase(String(value).replace(/[-\s]+/g, '_'))
return /^[0-9]/.test(key) ? `_${key}` : key
}
// A frozen, inspectable object literal for an enum's values — the JS-idiomatic
// answer to Ruby's `Network::INTERCEPT_PHASE` constant (see
// serialization.rb's Serialization module): a real value a caller can log,
// autocomplete on, or iterate, instead of a bare string they have to already know.
// Raw string values (e.g. 'beforeRequestSent') keep working unchanged — this is
// purely an additional, discoverable way to reach the same values.
function generateEnumConstantLiteral(values) {
const entries = values.map((v) => `${enumConstantKey(v)}: ${JSON.stringify(v)}`).join(', ')
return `Object.freeze({ ${entries} } as const)`
}
// The WebDriver BiDi spec's own anchor format for a command/event section
// (e.g. '#command-network-addIntercept', '#event-network-beforeRequestSent') —
// matches the @see links Ruby's generator emits for the same commands/events.
function specSectionUrl(methodStr, kind) {
const [domain, local] = methodStr.split('.')
return `https://w3c.github.io/webdriver-bidi/#${kind}-${domain}-${local}`
}
function generateClass({ className, commands, events, runtimeByTsName, enumConstants }) {
const lines = []
lines.push(INTERNAL_API_DOC)
lines.push(`export class ${className} extends Domain {`)
for (const evt of events) {
lines.push('')
lines.push(generateEventDescriptor(evt, runtimeByTsName))
}
for (const { propertyName, values } of enumConstants) {
lines.push('')
lines.push(` static readonly ${propertyName} = ${generateEnumConstantLiteral(values)}`)
}
lines.push('')
lines.push(` static async create(driver: unknown): Promise&lt;${className}> {`)
lines.push(` return new ${className}(await Domain.connect(driver), DOMAIN_TOKEN)`)
lines.push(` }`)
for (const cmd of commands) {
lines.push('')
lines.push(generateCommandMethod(cmd, runtimeByTsName))
}
lines.push(`}`)
return lines.join('\n')
}
// A static EventDescriptor&lt;T> constant — no subscribe/dispatch method. Callers
// reach events via the inherited addCallback(descriptor, handler), never a
// per-event generated method. When the params type has a registered runtime
// (record/union), it's passed to event() so addCallback() can validate each
// delivered payload through fromWire() before the caller's handler runs.
function generateEventDescriptor(evt, runtimeByTsName) {
const { eventName, methodStr, paramsTypeName } = evt
const paramsType = paramsTypeName ?? 'unknown'
const constName = screamingSnakeCase(eventName)
const paramsRuntime = paramsTypeName ? runtimeByTsName.get(paramsTypeName) : undefined
const runtimeArg =
paramsRuntime?.kind === 'record' || paramsRuntime?.kind === 'union' ? `, ${paramsRuntime.runtimeName}` : ''
const doc = ` /** @see ${specSectionUrl(methodStr, 'event')} */`
return `${doc}\n static readonly ${constName}: EventDescriptor&lt;${paramsType}> = event('${methodStr}'${runtimeArg})`
}
// A JSDoc block for a generated command method — readable without any TypeScript
// tooling, since a plain-JS user gets no autocomplete from the sibling .d.ts unless
// their editor happens to resolve it. Unrolls each params field individually (from
// the same field list defineRecord() validates against, not a second copy of it) so
// required vs. optional is visible in an ordinary hover, matching what Ruby's
// generator gives for free via real keyword arguments in the method signature.
function generateCommandJsDoc(cmd, paramsRuntime, resultTypeName) {
const { methodStr, paramsTypeName, hasParams } = cmd
const lines = [' /**']
if (hasParams) {
lines.push(` * @param {${paramsTypeName}} params`)
for (const field of paramsRuntime?.fields ?? []) {
const tsType = typeNodeToTs(field.type)
const tag = field.required ? `params.${field.name}` : `[params.${field.name}]`
lines.push(` * @param {${tsType}} ${tag}`)
}
}
lines.push(` * @returns {Promise&lt;${resultTypeName ?? 'void'}>}`)
lines.push(` * @see ${specSectionUrl(methodStr, 'command')}`)
lines.push(' */')
return lines.join('\n')
}
function generateCommandMethod(cmd, runtimeByTsName) {
const { methodName, methodStr, paramsTypeName, hasParams, resultTypeName } = cmd
const isVoid = resultTypeName === null
const returnType = isVoid ? 'void' : resultTypeName
// Use a double-cast (T as unknown as Record&lt;string,unknown>) so TypeScript
// accepts the conversion even when the params type has no index signature.
// Only actually used when there's no RecordClass/UnionClass to build a validated
// instance from below (paramsRuntime undefined) — otherwise sendArg overrides it.
const paramsCast = hasParams ? '(params as unknown as Record&lt;string, unknown>)' : '{}'
const paramsRuntime = hasParams ? runtimeByTsName.get(paramsTypeName) : undefined
const resultRuntime = !isVoid ? runtimeByTsName.get(resultTypeName) : undefined
const lines = [generateCommandJsDoc(cmd, paramsRuntime, isVoid ? null : resultTypeName)]
if (hasParams) {
lines.push(` async ${methodName}(params: ${paramsTypeName}): Promise&lt;${returnType}> {`)
} else {
lines.push(` async ${methodName}(): Promise&lt;${returnType}> {`)
}
// Outbound validation: constructing/building the params record throws on a violation
// before anything reaches the wire. Takes the original typed `params` directly
// (matching RecordClass&lt;T>'s `new (data: T)`), not the Record&lt;string, unknown> cast
// meant only for the wire send() call below. The *validated* instance — not the
// caller's original `params` — is what actually gets sent: its toJSON() is what
// converts JS-facing field names (params.prefersColorScheme) to their declared wire
// keys (prefers-color-scheme), including on any nested record/union field.
let sendArg = paramsCast
if (paramsRuntime?.kind === 'record') {
lines.push(` const validatedParams = new ${paramsRuntime.runtimeName}(params)`)
sendArg = '(validatedParams as unknown as Record&lt;string, unknown>)'
} else if (paramsRuntime?.kind === 'union') {
lines.push(` const validatedParams = ${paramsRuntime.runtimeName}.build(params)`)
sendArg = '(validatedParams as unknown as Record&lt;string, unknown>)'
}
// Domain.send() already checks for an error response and throws. Inbound
// validation then runs through the result's own fromWire() when one is
// registered; otherwise the result is cast as before.
if (isVoid) {
lines.push(` await this.send('${methodStr}', ${sendArg})`)
} else if (resultRuntime?.kind === 'record' || resultRuntime?.kind === 'union') {
lines.push(` const result = await this.send('${methodStr}', ${sendArg})`)
lines.push(` return ${resultRuntime.runtimeName}.fromWire(result) as unknown as ${resultTypeName}`)
} else {
lines.push(` return (await this.send('${methodStr}', ${sendArg})) as ${resultTypeName}`)
}
lines.push(` }`)
return lines.join('\n')
}
// ============================================================
// Entry point
// ============================================================
main().catch((err) => {
console.error(err)
process.exit(1)
})
</code></pre></article></section></div></div></div><div class="search-container" id="PkfLWpAbet" style="display:none"><div class="wrapper" id="iCxFxjkHbP"><button class="icon-button search-close-button" id="VjLlGakifb" aria-label="close search"><svg><use xlink:href="#close-icon"></use></svg></button><div class="search-box-c"><svg><use xlink:href="#search-icon"></use></svg> <input type="text" id="vpcKVYIppa" class="search-input" placeholder="Search..." autofocus></div><div class="search-result-c" id="fWwVHRuDuN"><span class="search-result-c-text">Type anything to view search result</span></div></div></div><div class="mobile-menu-icon-container"><button class="icon-button" id="mobile-menu" data-isopen="false" aria-label="menu"><svg><use xlink:href="#menu-icon"></use></svg></button></div><div id="mobile-sidebar" class="mobile-sidebar-container"><div class="mobile-sidebar-wrapper"><a href="/" class="sidebar-title sidebar-title-anchor">Selenium WebDriver JavaScript API</a><div class="mobile-nav-links"><div class="navbar-item"><a id="github-mobile" href="https://github.com/SeleniumHQ/selenium" target="">GitHub</a></div><div class="navbar-item"><a id="npm-mobile" href="https://www.npmjs.com/package/selenium-webdriver" target="">npm</a></div></div><div class="mobile-sidebar-items-c"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-selenium-webdriver_chrome.html">selenium-webdriver/chrome</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chromium.html">selenium-webdriver/chromium</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_edge.html">selenium-webdriver/edge</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_firefox.html">selenium-webdriver/firefox</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_ie.html">selenium-webdriver/ie</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_safari.html">selenium-webdriver/safari</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-classes"><div>Classes</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="Actions.html">Actions</a></div><div class="sidebar-section-children"><a href="Alert.html">Alert</a></div><div class="sidebar-section-children"><a href="AlertPromise.html">AlertPromise</a></div><div class="sidebar-section-children"><a href="ArgumentValue.html">ArgumentValue</a></div><div class="sidebar-section-children"><a href="BaseLogEntry.html">BaseLogEntry</a></div><div class="sidebar-section-children"><a href="BaseParameters.html">BaseParameters</a></div><div class="sidebar-section-children"><a href="BeforeRequestSent.html">BeforeRequestSent</a></div><div class="sidebar-section-children"><a href="BoxClipRectangle.html">BoxClipRectangle</a></div><div class="sidebar-section-children"><a href="global.html#Browser">Browser</a></div><div class="sidebar-section-children"><a href="BrowsingContext.html">BrowsingContext</a></div><div class="sidebar-section-children"><a href="BrowsingContextInfo.html">BrowsingContextInfo</a></div><div class="sidebar-section-children"><a href="BrowsingContextInspector.html">BrowsingContextInspector</a></div><div class="sidebar-section-children"><a href="BrowsingContextPartitionDescriptor.html">BrowsingContextPartitionDescriptor</a></div><div class="sidebar-section-children"><a href="Build.html">Build</a></div><div class="sidebar-section-children"><a href="Builder.html">Builder</a></div><div class="sidebar-section-children"><a href="By.html">By</a></div><div class="sidebar-section-children"><a href="BytesValue.html">BytesValue</a></div><div class="sidebar-section-children"><a href="Capabilities.html">Capabilities</a></div><div class="sidebar-section-children"><a href="CaptureScreenshotParameters.html">CaptureScreenshotParameters</a></div><div class="sidebar-section-children"><a href="ChannelValue.html">ChannelValue</a></div><div class="sidebar-section-children"><a href="ClientWindowInfo.html">ClientWindowInfo</a></div><div class="sidebar-section-children"><a href="ClipRectangle.html">ClipRectangle</a></div><div class="sidebar-section-children"><a href="Color.html">Color</a></div><div class="sidebar-section-children"><a href="Command.html">Command</a></div><div class="sidebar-section-children"><a href="Command.html">Command</a></div><div class="sidebar-section-children"><a href="Condition.html">Condition</a></div><div class="sidebar-section-children"><a href="ConsoleLogEntry.html">ConsoleLogEntry</a></div><div class="sidebar-section-children"><a href="ContinueRequestParameters.html">ContinueRequestParameters</a></div><div class="sidebar-section-children"><a href="ContinueResponseParameters.html">ContinueResponseParameters</a></div><div class="sidebar-section-children"><a href="Cookie.html">Cookie</a></div><div class="sidebar-section-children"><a href="CookieFilter.html">CookieFilter</a></div><div class="sidebar-section-children"><a href="CreateContextParameters.html">CreateContextParameters</a></div><div class="sidebar-section-children"><a href="Credential.html">Credential</a></div><div class="sidebar-section-children"><a href="DetachedShadowRootError.html">DetachedShadowRootError</a></div><div class="sidebar-section-children"><a href="Device.html">Device</a></div><div class="sidebar-section-children"><a href="Domain.html">Domain</a></div><div class="sidebar-section-children"><a href="DriverService.html">DriverService</a></div><div class="sidebar-section-children"><a href="DriverService.Builder.html">Builder</a></div><div class="sidebar-section-children"><a href="ElementClickInterceptedError.html">ElementClickInterceptedError</a></div><div class="sidebar-section-children"><a href="ElementClipRectangle.html">ElementClipRectangle</a></div><div class="sidebar-section-children"><a href="ElementNotInteractableError.html">ElementNotInteractableError</a></div><div class="sidebar-section-children"><a href="ElementNotSelectableError.html">ElementNotSelectableError</a></div><div class="sidebar-section-children"><a href="Entry.html">Entry</a></div><div class="sidebar-section-children"><a href="Environment.html">Environment</a></div><div class="sidebar-section-children"><a href="EvaluateResultException.html">EvaluateResultException</a></div><div class="sidebar-section-children"><a href="EvaluateResultSuccess.html">EvaluateResultSuccess</a></div><div class="sidebar-section-children"><a href="ExceptionDetails.html">ExceptionDetails</a></div><div class="sidebar-section-children"><a href="Executor.html">Executor</a></div><div class="sidebar-section-children"><a href="FetchError.html">FetchError</a></div><div class="sidebar-section-children"><a href="FetchTimingInfo.html">FetchTimingInfo</a></div><div class="sidebar-section-children"><a href="FileDetector.html">FileDetector</a></div><div class="sidebar-section-children"><a href="FileDetector.html">FileDetector</a></div><div class="sidebar-section-children"><a href="GenericLogEntry.html">GenericLogEntry</a></div><div class="sidebar-section-children"><a href="Header.html">Header</a></div><div class="sidebar-section-children"><a href="HttpClient.html">HttpClient</a></div><div class="sidebar-section-children"><a href="HttpResponse.html">HttpResponse</a></div><div class="sidebar-section-children"><a href="Index_.html">Index</a></div><div class="sidebar-section-children"><a href="Initiator.html">Initiator</a></div><div class="sidebar-section-children"><a href="Input.html">Input</a></div><div class="sidebar-section-children"><a href="InsecureCertificateError.html">InsecureCertificateError</a></div><div class="sidebar-section-children"><a href="InvalidArgumentError.html">InvalidArgumentError</a></div><div class="sidebar-section-children"><a href="InvalidCharacterError.html">InvalidCharacterError</a></div><div class="sidebar-section-children"><a href="InvalidCookieDomainError.html">InvalidCookieDomainError</a></div><div class="sidebar-section-children"><a href="InvalidCoordinatesError.html">InvalidCoordinatesError</a></div><div class="sidebar-section-children"><a href="InvalidElementStateError.html">InvalidElementStateError</a></div><div class="sidebar-section-children"><a href="InvalidSelectorError.html">InvalidSelectorError</a></div><div class="sidebar-section-children"><a href="JavascriptError.html">JavascriptError</a></div><div class="sidebar-section-children"><a href="JavascriptLogEntry.html">JavascriptLogEntry</a></div><div class="sidebar-section-children"><a href="Keyboard.html">Keyboard</a></div><div class="sidebar-section-children"><a href="Level.html">Level</a></div><div class="sidebar-section-children"><a href="LocalValue.html">LocalValue</a></div><div class="sidebar-section-children"><a href="Locator.html">Locator</a></div><div class="sidebar-section-children"><a href="LogManager.html">LogManager</a></div><div class="sidebar-section-children"><a href="Logger.html">Logger</a></div><div class="sidebar-section-children"><a href="Message.html">Message</a></div><div class="sidebar-section-children"><a href="MoveTargetOutOfBoundsError.html">MoveTargetOutOfBoundsError</a></div><div class="sidebar-section-children"><a href="NavigateResult.html">NavigateResult</a></div><div class="sidebar-section-children"><a href="NavigationInfo.html">NavigationInfo</a></div><div class="sidebar-section-children"><a href="Network.html">Network</a></div><div class="sidebar-section-children"><a href="NetworkInspector.html">NetworkInspector</a></div><div class="sidebar-section-children"><a href="NoSuchAlertError.html">NoSuchAlertError</a></div><div class="sidebar-section-children"><a href="NoSuchCookieError.html">NoSuchCookieError</a></div><div class="sidebar-section-children"><a href="NoSuchElementError.html">NoSuchElementError</a></div><div class="sidebar-section-children"><a href="NoSuchFrameError.html">NoSuchFrameError</a></div><div class="sidebar-section-children"><a href="NoSuchSessionError.html">NoSuchSessionError</a></div><div class="sidebar-section-children"><a href="NoSuchShadowRootError.html">NoSuchShadowRootError</a></div><div class="sidebar-section-children"><a href="NoSuchWindowError.html">NoSuchWindowError</a></div><div class="sidebar-section-children"><a href="PartialCookie.html">PartialCookie</a></div><div class="sidebar-section-children"><a href="PartitionDescriptor.html">PartitionDescriptor</a></div><div class="sidebar-section-children"><a href="PartitionKey.html">PartitionKey</a></div><div class="sidebar-section-children"><a href="Pointer.html">Pointer</a></div><div class="sidebar-section-children"><a href="Preferences.html">Preferences</a></div><div class="sidebar-section-children"><a href="PrintResult.html">PrintResult</a></div><div class="sidebar-section-children"><a href="ProvideResponseParameters.html">ProvideResponseParameters</a></div><div class="sidebar-section-children"><a href="RealmInfo.html">RealmInfo</a></div><div class="sidebar-section-children"><a href="ReferenceValue.html">ReferenceValue</a></div><div class="sidebar-section-children"><a href="RegExpValue.html">RegExpValue</a></div><div class="sidebar-section-children"><a href="RelativeBy.html">RelativeBy</a></div><div class="sidebar-section-children"><a href="RemoteValue.html">RemoteValue</a></div><div class="sidebar-section-children"><a href="Request.html">Request</a></div><div class="sidebar-section-children"><a href="RequestData.html">RequestData</a></div><div class="sidebar-section-children"><a href="Response.html">Response</a></div><div class="sidebar-section-children"><a href="ResponseData.html">ResponseData</a></div><div class="sidebar-section-children"><a href="ResponseStarted.html">ResponseStarted</a></div><div class="sidebar-section-children"><a href="Result.html">Result</a></div><div class="sidebar-section-children"><a href="ScriptManager.html">ScriptManager</a></div><div class="sidebar-section-children"><a href="ScriptTimeoutError.html">ScriptTimeoutError</a></div><div class="sidebar-section-children"><a href="Select.html">Select</a></div><div class="sidebar-section-children"><a href="SeleniumServer.html">SeleniumServer</a></div><div class="sidebar-section-children"><a href="SerializationOptions.html">SerializationOptions</a></div><div class="sidebar-section-children"><a href="Server.html">Server</a></div><div class="sidebar-section-children"><a href="Session.html">Session</a></div><div class="sidebar-section-children"><a href="SessionNotCreatedError.html">SessionNotCreatedError</a></div><div class="sidebar-section-children"><a href="ShadowRoot.html">ShadowRoot</a></div><div class="sidebar-section-children"><a href="ShadowRootPromise.html">ShadowRootPromise</a></div><div class="sidebar-section-children"><a href="Source.html">Source</a></div><div class="sidebar-section-children"><a href="StaleElementReferenceError.html">StaleElementReferenceError</a></div><div class="sidebar-section-children"><a href="Storage.html">Storage</a></div><div class="sidebar-section-children"><a href="StorageKeyPartitionDescriptor.html">StorageKeyPartitionDescriptor</a></div><div class="sidebar-section-children"><a href="TimeoutError.html">TimeoutError</a></div><div class="sidebar-section-children"><a href="UnableToCaptureScreenError.html">UnableToCaptureScreenError</a></div><div class="sidebar-section-children"><a href="UnableToSetCookieError.html">UnableToSetCookieError</a></div><div class="sidebar-section-children"><a href="UnexpectedAlertOpenError.html">UnexpectedAlertOpenError</a></div><div class="sidebar-section-children"><a href="UnknownCommandError.html">UnknownCommandError</a></div><div class="sidebar-section-children"><a href="UnknownMethodError.html">UnknownMethodError</a></div><div class="sidebar-section-children"><a href="UnsupportedOperationError.html">UnsupportedOperationError</a></div><div class="sidebar-section-children"><a href="UrlPattern.html">UrlPattern</a></div><div class="sidebar-section-children"><a href="VirtualAuthenticatorOptions.html">VirtualAuthenticatorOptions</a></div><div class="sidebar-section-children"><a href="WebDriver.html">WebDriver</a></div><div class="sidebar-section-children"><a href="WebDriverError.html">WebDriverError</a></div><div class="sidebar-section-children"><a href="WebElement.html">WebElement</a></div><div class="sidebar-section-children"><a href="WebElementCondition.html">WebElementCondition</a></div><div class="sidebar-section-children"><a href="WebElementPromise.html">WebElementPromise</a></div><div class="sidebar-section-children"><a href="Wheel.html">Wheel</a></div><div class="sidebar-section-children"><a href="WindowRealmInfo.html">WindowRealmInfo</a></div><div class="sidebar-section-children"><a href="Zip.html">Zip</a></div><div class="sidebar-section-children"><a href="createDriver-thenableWebDriverProxy.html">thenableWebDriverProxy</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chrome-Driver.html">Driver</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chrome-Options.html">Options</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chrome-ServiceBuilder.html">ServiceBuilder</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chromium-Driver.html">Driver</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chromium-Extensions.html">Extensions</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chromium-Options.html">Options</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_chromium-ServiceBuilder.html">ServiceBuilder</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_edge-Driver.html">Driver</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_edge-Options.html">Options</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_edge-ServiceBuilder.html">ServiceBuilder</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_firefox-Channel.html">Channel</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_firefox-Driver.html">Driver</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_firefox-Options.html">Options</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_firefox-ServiceBuilder.html">ServiceBuilder</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_ie-Driver.html">Driver</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_ie-Options.html">Options</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_ie-ServiceBuilder.html">ServiceBuilder</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_safari-Driver.html">Driver</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_safari-Options.html">Options</a></div><div class="sidebar-section-children"><a href="module-selenium-webdriver_safari-ServiceBuilder.html">ServiceBuilder</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-interfaces"><div>Interfaces</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="Action.html">Action</a></div><div class="sidebar-section-children"><a href="Client.html">Client</a></div><div class="sidebar-section-children"><a href="global.html#Config">Config</a></div><div class="sidebar-section-children"><a href="Executor.html">Executor</a></div><div class="sidebar-section-children"><a href="ISelect.html">ISelect</a></div><div class="sidebar-section-children"><a href="IWebDriver.html">IWebDriver</a></div><div class="sidebar-section-children"><a href="global.html#ManualConfig">ManualConfig</a></div><div class="sidebar-section-children"><a href="Options.html">Options</a></div><div class="sidebar-section-children"><a href="Options.Cookie.html">Cookie</a></div><div class="sidebar-section-children"><a href="global.html#PacConfig">PacConfig</a></div><div class="sidebar-section-children"><a href="SeleniumServer.Options.html">Options</a></div><div class="sidebar-section-children"><a href="ServiceOptions.html">ServiceOptions</a></div><div class="sidebar-section-children"><a href="SuiteOptions.html">SuiteOptions</a></div><div class="sidebar-section-children"><a href="TargetBrowser.html">TargetBrowser</a></div><div class="sidebar-section-children"><a href="ThenableWebDriver.html">ThenableWebDriver</a></div><div class="sidebar-section-children"><a href="Timeouts.html">Timeouts</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#Atom">Atom</a></div><div class="sidebar-section-children"><a href="global.html#Browser">Browser</a></div><div class="sidebar-section-children"><a href="global.html#Button">Button</a></div><div class="sidebar-section-children"><a href="global.html#ByHash">ByHash</a></div><div class="sidebar-section-children"><a href="global.html#Capability">Capability</a></div><div class="sidebar-section-children"><a href="global.html#CommandLineFlag">CommandLineFlag</a></div><div class="sidebar-section-children"><a href="global.html#CommandSpec">CommandSpec</a></div><div class="sidebar-section-children"><a href="global.html#CommandTransformer">CommandTransformer</a></div><div class="sidebar-section-children"><a href="global.html#Config">Config</a></div><div class="sidebar-section-children"><a href="global.html#ErrorCode">ErrorCode</a></div><div class="sidebar-section-children"><a href="global.html#EvaluateResultType">EvaluateResultType</a></div><div class="sidebar-section-children"><a href="global.html#INTERNAL_COMPUTE_OFFSET_SCRIPT">INTERNAL_COMPUTE_OFFSET_SCRIPT</a></div><div class="sidebar-section-children"><a href="global.html#InterceptPhase">InterceptPhase</a></div><div class="sidebar-section-children"><a href="global.html#Key">Key</a></div><div class="sidebar-section-children"><a href="global.html#ManualConfig">ManualConfig</a></div><div class="sidebar-section-children"><a href="global.html#Name">Name</a></div><div class="sidebar-section-children"><a href="global.html#NonPrimitiveType">NonPrimitiveType</a></div><div class="sidebar-section-children"><a href="global.html#Origin">Origin</a></div><div class="sidebar-section-children"><a href="global.html#Origin">Origin</a></div><div class="sidebar-section-children"><a href="global.html#PINNED_BROWSERS">PINNED_BROWSERS</a></div><div class="sidebar-section-children"><a href="global.html#PacConfig">PacConfig</a></div><div class="sidebar-section-children"><a href="global.html#PageLoadStrategy">PageLoadStrategy</a></div><div class="sidebar-section-children"><a href="global.html#Platform">Platform</a></div><div class="sidebar-section-children"><a href="global.html#PrimitiveType">PrimitiveType</a></div><div class="sidebar-section-children"><a href="global.html#Protocol">Protocol</a></div><div class="sidebar-section-children"><a href="global.html#RealmType">RealmType</a></div><div class="sidebar-section-children"><a href="global.html#RemoteReferenceType">RemoteReferenceType</a></div><div class="sidebar-section-children"><a href="global.html#RemoteType">RemoteType</a></div><div class="sidebar-section-children"><a href="global.html#RequestOptions">RequestOptions</a></div><div class="sidebar-section-children"><a href="global.html#ResultOwnership">ResultOwnership</a></div><div class="sidebar-section-children"><a href="global.html#SameSite">SameSite</a></div><div class="sidebar-section-children"><a href="global.html#SpecialNumberType">SpecialNumberType</a></div><div class="sidebar-section-children"><a href="global.html#StdIoOptions">StdIoOptions</a></div><div class="sidebar-section-children"><a href="global.html#THENABLE_DRIVERS">THENABLE_DRIVERS</a></div><div class="sidebar-section-children"><a href="global.html#Transport">Transport</a></div><div class="sidebar-section-children"><a href="global.html#Type">Type</a></div><div class="sidebar-section-children"><a href="global.html#Type">Type</a></div><div class="sidebar-section-children"><a href="global.html#Type">Type</a></div><div class="sidebar-section-children"><a href="global.html#Type">Type</a></div><div class="sidebar-section-children"><a href="global.html#USER_AGENT">USER_AGENT</a></div><div class="sidebar-section-children"><a href="global.html#UserPromptHandler">UserPromptHandler</a></div><div class="sidebar-section-children"><a href="global.html#W3C_COMMAND_MAP">W3C_COMMAND_MAP</a></div><div class="sidebar-section-children"><a href="global.html#ableToSwitchToFrame">ableToSwitchToFrame</a></div><div class="sidebar-section-children"><a href="global.html#addConsoleHandler">addConsoleHandler</a></div><div class="sidebar-section-children"><a href="global.html#alertIsPresent">alertIsPresent</a></div><div class="sidebar-section-children"><a href="global.html#applyOverrides">applyOverrides</a></div><div class="sidebar-section-children"><a href="global.html#applyVendor">applyVendor</a></div><div class="sidebar-section-children"><a href="global.html#arraysEqual">arraysEqual</a></div><div class="sidebar-section-children"><a href="global.html#balancedBody">balancedBody</a></div><div class="sidebar-section-children"><a href="global.html#bazelJava">bazelJava</a></div><div class="sidebar-section-children"><a href="global.html#binaryPaths">binaryPaths</a></div><div class="sidebar-section-children"><a href="global.html#branchType">branchType</a></div><div class="sidebar-section-children"><a href="global.html#buildDefMap">buildDefMap</a></div><div class="sidebar-section-children"><a href="global.html#buildEmptyParamTypes">buildEmptyParamTypes</a></div><div class="sidebar-section-children"><a href="global.html#buildModel">buildModel</a></div><div class="sidebar-section-children"><a href="global.html#buildPath">buildPath</a></div><div class="sidebar-section-children"><a href="global.html#buildRequest">buildRequest</a></div><div class="sidebar-section-children"><a href="global.html#buildResultTypeNames">buildResultTypeNames</a></div><div class="sidebar-section-children"><a href="global.html#buildSpecHrefs">buildSpecHrefs</a></div><div class="sidebar-section-children"><a href="global.html#buildSpecLinks">buildSpecLinks</a></div><div class="sidebar-section-children"><a href="global.html#builtTargets">builtTargets</a></div><div class="sidebar-section-children"><a href="global.html#canonicalizeVariantParams">canonicalizeVariantParams</a></div><div class="sidebar-section-children"><a href="global.html#check">check</a></div><div class="sidebar-section-children"><a href="global.html#checkCodePoint">checkCodePoint</a></div><div class="sidebar-section-children"><a href="global.html#checkCompleteness">checkCompleteness</a></div><div class="sidebar-section-children"><a href="global.html#checkLegacyResponse">checkLegacyResponse</a></div><div class="sidebar-section-children"><a href="global.html#checkOptions">checkOptions</a></div><div class="sidebar-section-children"><a href="global.html#checkSchema">checkSchema</a></div><div class="sidebar-section-children"><a href="global.html#checkedCall">checkedCall</a></div><div class="sidebar-section-children"><a href="global.html#checkedNodeCall">checkedNodeCall</a></div><div class="sidebar-section-children"><a href="global.html#choiceBranches">choiceBranches</a></div><div class="sidebar-section-children"><a href="global.html#closeBidiConnection">closeBidiConnection</a></div><div class="sidebar-section-children"><a href="global.html#collectAllMembers">collectAllMembers</a></div><div class="sidebar-section-children"><a href="global.html#collectReferencedNames">collectReferencedNames</a></div><div class="sidebar-section-children"><a href="global.html#collectUnionMembers">collectUnionMembers</a></div><div class="sidebar-section-children"><a href="global.html#color">color</a></div><div class="sidebar-section-children"><a href="global.html#computeCrossDomainImports">computeCrossDomainImports</a></div><div class="sidebar-section-children"><a href="global.html#connections">connections</a></div><div class="sidebar-section-children"><a href="global.html#consoleHandler">consoleHandler</a></div><div class="sidebar-section-children"><a href="global.html#copy">copy</a></div><div class="sidebar-section-children"><a href="global.html#copyDir">copyDir</a></div><div class="sidebar-section-children"><a href="global.html#createConnection">createConnection</a></div><div class="sidebar-section-children"><a href="global.html#createDriver">createDriver</a></div><div class="sidebar-section-children"><a href="global.html#dedupeDefs">dedupeDefs</a></div><div class="sidebar-section-children"><a href="global.html#defineAlias">defineAlias</a></div><div class="sidebar-section-children"><a href="global.html#defineEnum">defineEnum</a></div><div class="sidebar-section-children"><a href="global.html#defineRecord">defineRecord</a></div><div class="sidebar-section-children"><a href="global.html#defineUnion">defineUnion</a></div><div class="sidebar-section-children"><a href="global.html#delayed">delayed</a></div><div class="sidebar-section-children"><a href="global.html#detectInlineVariant">detectInlineVariant</a></div><div class="sidebar-section-children"><a href="global.html#diffAgainstCddl2ts">diffAgainstCddl2ts</a></div><div class="sidebar-section-children"><a href="global.html#direct">direct</a></div><div class="sidebar-section-children"><a href="global.html#domainForTypeName">domainForTypeName</a></div><div class="sidebar-section-children"><a href="global.html#eachPropertyDeep">eachPropertyDeep</a></div><div class="sidebar-section-children"><a href="global.html#elementIsDisabled">elementIsDisabled</a></div><div class="sidebar-section-children"><a href="global.html#elementIsEnabled">elementIsEnabled</a></div><div class="sidebar-section-children"><a href="global.html#elementIsNotSelected">elementIsNotSelected</a></div><div class="sidebar-section-children"><a href="global.html#elementIsNotVisible">elementIsNotVisible</a></div><div class="sidebar-section-children"><a href="global.html#elementIsSelected">elementIsSelected</a></div><div class="sidebar-section-children"><a href="global.html#elementIsVisible">elementIsVisible</a></div><div class="sidebar-section-children"><a href="global.html#elementLocated">elementLocated</a></div><div class="sidebar-section-children"><a href="global.html#elementTextContains">elementTextContains</a></div><div class="sidebar-section-children"><a href="global.html#elementTextIs">elementTextIs</a></div><div class="sidebar-section-children"><a href="global.html#elementTextMatches">elementTextMatches</a></div><div class="sidebar-section-children"><a href="global.html#elementsLocated">elementsLocated</a></div><div class="sidebar-section-children"><a href="global.html#encodeError">encodeError</a></div><div class="sidebar-section-children"><a href="global.html#ensureFileDetectorsAreEnabled">ensureFileDetectorsAreEnabled</a></div><div class="sidebar-section-children"><a href="global.html#escapeCss">escapeCss</a></div><div class="sidebar-section-children"><a href="global.html#event">event</a></div><div class="sidebar-section-children"><a href="global.html#exec">exec</a></div><div class="sidebar-section-children"><a href="global.html#executeCommand">executeCommand</a></div><div class="sidebar-section-children"><a href="global.html#exists">exists</a></div><div class="sidebar-section-children"><a href="global.html#expectedUnionFields">expectedUnionFields</a></div><div class="sidebar-section-children"><a href="global.html#extractAnchors">extractAnchors</a></div><div class="sidebar-section-children"><a href="global.html#extractCommands">extractCommands</a></div><div class="sidebar-section-children"><a href="global.html#extractEvents">extractEvents</a></div><div class="sidebar-section-children"><a href="global.html#extractId">extractId</a></div><div class="sidebar-section-children"><a href="global.html#extractVendor">extractVendor</a></div><div class="sidebar-section-children"><a href="global.html#filter">filter</a></div><div class="sidebar-section-children"><a href="global.html#filterNonW3CCaps">filterNonW3CCaps</a></div><div class="sidebar-section-children"><a href="global.html#findFreePort">findFreePort</a></div><div class="sidebar-section-children"><a href="global.html#findInPath">findInPath</a></div><div class="sidebar-section-children"><a href="global.html#flattenGroupComposition">flattenGroupComposition</a></div><div class="sidebar-section-children"><a href="global.html#formatSpawnArgs">formatSpawnArgs</a></div><div class="sidebar-section-children"><a href="global.html#fromWireValue">fromWireValue</a></div><div class="sidebar-section-children"><a href="global.html#fullyResolveKeys">fullyResolveKeys</a></div><div class="sidebar-section-children"><a href="global.html#fullyResolved">fullyResolved</a></div><div class="sidebar-section-children"><a href="global.html#generateTypeDeclaration">generateTypeDeclaration</a></div><div class="sidebar-section-children"><a href="global.html#generateTypeScript">generateTypeScript</a></div><div class="sidebar-section-children"><a href="global.html#getAddress">getAddress</a></div><div class="sidebar-section-children"><a href="global.html#getAvailableBrowsers">getAvailableBrowsers</a></div><div class="sidebar-section-children"><a href="global.html#getBidiConnection">getBidiConnection</a></div><div class="sidebar-section-children"><a href="global.html#getBinary">getBinary</a></div><div class="sidebar-section-children"><a href="global.html#getBinaryPaths">getBinaryPaths</a></div><div class="sidebar-section-children"><a href="global.html#getBrowsersToTestFromEnv">getBrowsersToTestFromEnv</a></div><div class="sidebar-section-children"><a href="global.html#getBrowsingContextInstance">getBrowsingContextInstance</a></div><div class="sidebar-section-children"><a href="global.html#getHostName">getHostName</a></div><div class="sidebar-section-children"><a href="global.html#getIPAddress">getIPAddress</a></div><div class="sidebar-section-children"><a href="global.html#getJavaPath">getJavaPath</a></div><div class="sidebar-section-children"><a href="global.html#getLevel">getLevel</a></div><div class="sidebar-section-children"><a href="global.html#getLogInspectorInstance">getLogInspectorInstance</a></div><div class="sidebar-section-children"><a href="global.html#getLogger">getLogger</a></div><div class="sidebar-section-children"><a href="global.html#getLoopbackAddress">getLoopbackAddress</a></div><div class="sidebar-section-children"><a href="global.html#getRequestOptions">getRequestOptions</a></div><div class="sidebar-section-children"><a href="global.html#getStatus">getStatus</a></div><div class="sidebar-section-children"><a href="global.html#getTestHook">getTestHook</a></div><div class="sidebar-section-children"><a href="global.html#groupTypesByDomain">groupTypesByDomain</a></div><div class="sidebar-section-children"><a href="global.html#headersToString">headersToString</a></div><div class="sidebar-section-children"><a href="global.html#hoistInlineEnums">hoistInlineEnums</a></div><div class="sidebar-section-children"><a href="global.html#hoistInlineRecords">hoistInlineRecords</a></div><div class="sidebar-section-children"><a href="global.html#ignore">ignore</a></div><div class="sidebar-section-children"><a href="global.html#inheritedVendor">inheritedVendor</a></div><div class="sidebar-section-children"><a href="global.html#init">init</a></div><div class="sidebar-section-children"><a href="global.html#installConsoleHandler">installConsoleHandler</a></div><div class="sidebar-section-children"><a href="global.html#isErrorResponse">isErrorResponse</a></div><div class="sidebar-section-children"><a href="global.html#isFree">isFree</a></div><div class="sidebar-section-children"><a href="global.html#isGroupRef">isGroupRef</a></div><div class="sidebar-section-children"><a href="global.html#isId">isId</a></div><div class="sidebar-section-children"><a href="global.html#isIdle">isIdle</a></div><div class="sidebar-section-children"><a href="global.html#isInlineGroup">isInlineGroup</a></div><div class="sidebar-section-children"><a href="global.html#isLiteral">isLiteral</a></div><div class="sidebar-section-children"><a href="global.html#isNullArm">isNullArm</a></div><div class="sidebar-section-children"><a href="global.html#isObject">isObject</a></div><div class="sidebar-section-children"><a href="global.html#isPromise">isPromise</a></div><div class="sidebar-section-children"><a href="global.html#isRetryableNetworkError">isRetryableNetworkError</a></div><div class="sidebar-section-children"><a href="global.html#isSelenium3x">isSelenium3x</a></div><div class="sidebar-section-children"><a href="global.html#legacyTimeout">legacyTimeout</a></div><div class="sidebar-section-children"><a href="global.html#load">load</a></div><div class="sidebar-section-children"><a href="global.html#locate">locate</a></div><div class="sidebar-section-children"><a href="global.html#locateWith">locateWith</a></div><div class="sidebar-section-children"><a href="global.html#manual">manual</a></div><div class="sidebar-section-children"><a href="global.html#map">map</a></div><div class="sidebar-section-children"><a href="global.html#mkdir">mkdir</a></div><div class="sidebar-section-children"><a href="global.html#mkdirp">mkdirp</a></div><div class="sidebar-section-children"><a href="global.html#nameAllocator">nameAllocator</a></div><div class="sidebar-section-children"><a href="global.html#normalizeAst">normalizeAst</a></div><div class="sidebar-section-children"><a href="global.html#normalizeDottedName">normalizeDottedName</a></div><div class="sidebar-section-children"><a href="global.html#of">of</a></div><div class="sidebar-section-children"><a href="global.html#pac">pac</a></div><div class="sidebar-section-children"><a href="global.html#pad">pad</a></div><div class="sidebar-section-children"><a href="global.html#parseCddl2ts">parseCddl2ts</a></div><div class="sidebar-section-children"><a href="global.html#parseHttpResponse">parseHttpResponse</a></div><div class="sidebar-section-children"><a href="global.html#parseLeafDef">parseLeafDef</a></div><div class="sidebar-section-children"><a href="global.html#pascal">pascal</a></div><div class="sidebar-section-children"><a href="global.html#path">path</a></div><div class="sidebar-section-children"><a href="global.html#pinnedGridArgs">pinnedGridArgs</a></div><div class="sidebar-section-children"><a href="global.html#projectRecord">projectRecord</a></div><div class="sidebar-section-children"><a href="global.html#projectRoot">projectRoot</a></div><div class="sidebar-section-children"><a href="global.html#projectSchema">projectSchema</a></div><div class="sidebar-section-children"><a href="global.html#read">read</a></div><div class="sidebar-section-children"><a href="global.html#refsIn">refsIn</a></div><div class="sidebar-section-children"><a href="global.html#removeConsoleHandler">removeConsoleHandler</a></div><div class="sidebar-section-children"><a href="global.html#requireAtom">requireAtom</a></div><div class="sidebar-section-children"><a href="global.html#resolveAliasRuntime">resolveAliasRuntime</a></div><div class="sidebar-section-children"><a href="global.html#resolveCommandLineFlags">resolveCommandLineFlags</a></div><div class="sidebar-section-children"><a href="global.html#resolveInputPath">resolveInputPath</a></div><div class="sidebar-section-children"><a href="global.html#resolveWaitMessage">resolveWaitMessage</a></div><div class="sidebar-section-children"><a href="global.html#rmDir">rmDir</a></div><div class="sidebar-section-children"><a href="global.html#schemaToCommands">schemaToCommands</a></div><div class="sidebar-section-children"><a href="global.html#schemaToEvents">schemaToEvents</a></div><div class="sidebar-section-children"><a href="global.html#schemaTypeFields">schemaTypeFields</a></div><div class="sidebar-section-children"><a href="global.html#sendIndex">sendIndex</a></div><div class="sidebar-section-children"><a href="global.html#sendRequest">sendRequest</a></div><div class="sidebar-section-children"><a href="global.html#serialize">serialize</a></div><div class="sidebar-section-children"><a href="global.html#setFileDetector">setFileDetector</a></div><div class="sidebar-section-children"><a href="global.html#shouldRetryRequest">shouldRetryRequest</a></div><div class="sidebar-section-children"><a href="global.html#socks">socks</a></div><div class="sidebar-section-children"><a href="global.html#spliceExtensionGroups">spliceExtensionGroups</a></div><div class="sidebar-section-children"><a href="global.html#splitHostAndPort">splitHostAndPort</a></div><div class="sidebar-section-children"><a href="global.html#splitName">splitName</a></div><div class="sidebar-section-children"><a href="global.html#splitTopLevel">splitTopLevel</a></div><div class="sidebar-section-children"><a href="global.html#stalenessOf">stalenessOf</a></div><div class="sidebar-section-children"><a href="global.html#start">start</a></div><div class="sidebar-section-children"><a href="global.html#startSeleniumServer">startSeleniumServer</a></div><div class="sidebar-section-children"><a href="global.html#stat">stat</a></div><div class="sidebar-section-children"><a href="global.html#stop">stop</a></div><div class="sidebar-section-children"><a href="global.html#stripObjectBodies">stripObjectBodies</a></div><div class="sidebar-section-children"><a href="global.html#suite">suite</a></div><div class="sidebar-section-children"><a href="global.html#suite">suite</a></div><div class="sidebar-section-children"><a href="global.html#suiteBrowsers">suiteBrowsers</a></div><div class="sidebar-section-children"><a href="global.html#system">system</a></div><div class="sidebar-section-children"><a href="global.html#thenFinally">thenFinally</a></div><div class="sidebar-section-children"><a href="global.html#throwDecodedError">throwDecodedError</a></div><div class="sidebar-section-children"><a href="global.html#titleContains">titleContains</a></div><div class="sidebar-section-children"><a href="global.html#titleIs">titleIs</a></div><div class="sidebar-section-children"><a href="global.html#titleMatches">titleMatches</a></div><div class="sidebar-section-children"><a href="global.html#tmpDir">tmpDir</a></div><div class="sidebar-section-children"><a href="global.html#tmpFile">tmpFile</a></div><div class="sidebar-section-children"><a href="global.html#toExecuteAtomCommand">toExecuteAtomCommand</a></div><div class="sidebar-section-children"><a href="global.html#toMap">toMap</a></div><div class="sidebar-section-children"><a href="global.html#toWireValue">toWireValue</a></div><div class="sidebar-section-children"><a href="global.html#topLevelFields">topLevelFields</a></div><div class="sidebar-section-children"><a href="global.html#trimRedundantPrefix">trimRedundantPrefix</a></div><div class="sidebar-section-children"><a href="global.html#tryParse">tryParse</a></div><div class="sidebar-section-children"><a href="global.html#tsName">tsName</a></div><div class="sidebar-section-children"><a href="global.html#typeList">typeList</a></div><div class="sidebar-section-children"><a href="global.html#typeNodeToTs">typeNodeToTs</a></div><div class="sidebar-section-children"><a href="global.html#typeRefNames">typeRefNames</a></div><div class="sidebar-section-children"><a href="global.html#unionSelector">unionSelector</a></div><div class="sidebar-section-children"><a href="global.html#unlink">unlink</a></div><div class="sidebar-section-children"><a href="global.html#unzip">unzip</a></div><div class="sidebar-section-children"><a href="global.html#url">url</a></div><div class="sidebar-section-children"><a href="global.html#urlContains">urlContains</a></div><div class="sidebar-section-children"><a href="global.html#urlIs">urlIs</a></div><div class="sidebar-section-children"><a href="global.html#urlMatches">urlMatches</a></div><div class="sidebar-section-children"><a href="global.html#variantRecord">variantRecord</a></div><div class="sidebar-section-children"><a href="global.html#waitForServer">waitForServer</a></div><div class="sidebar-section-children"><a href="global.html#waitForUrl">waitForUrl</a></div><div class="sidebar-section-children"><a href="global.html#walkDir">walkDir</a></div><div class="sidebar-section-children"><a href="global.html#whereIs">whereIs</a></div><div class="sidebar-section-children"><a href="global.html#withTagName">withTagName</a></div><div class="sidebar-section-children"><a href="global.html#write">write</a></div></div></div><div class="mobile-navbar-actions"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#light-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div></div></div><script type="text/javascript" src="scripts/core.min.js"></script><script src="scripts/search.min.js" defer="defer"></script><script src="scripts/third-party/fuse.js" defer="defer"></script><script type="text/javascript">var tocbotInstance=tocbot.init({tocSelector:"#eed4d2a0bfd64539bb9df78095dec881",contentSelector:".main-content",headingSelector:"h1, h2, h3",hasInnerContainers:!0,scrollContainer:".main-content",headingsOffset:130,onClick:bringLinkToView})</script></body></html>