BiDirectional functionality BiDirectional means that communication is happening in two directions simultaneously.
The traditional WebDriver model involves strict request/response commands which only allows for communication to
happen in one direction at any given time. In most cases this is what you want; it ensures that the browser is
doing the expected things in the right order, but there are a number of interesting things that can be done with
asynchronous interactions.
This functionality is currently available in a limited fashion with the [Chrome DevTools Protocol] (CDP),
but to address some of its drawbacks, the Selenium team, along with the major
browser vendors, have worked to create the new WebDriver BiDi Protocol .
This specification aims to create a stable, cross-browser API that leverages bidirectional
communication for enhanced browser automation and testing functionality,
including streaming events from the user agent to the controlling software via WebSockets.
Users will be able to listen for and record or manipulate events as they happen during the course of a Selenium session.
To use WebDriver BiDi, you must enable it in Options
Note that Selenium is updating its entire implementation from WebDriver Classic to WebDriver BiDi (while
maintaining backwards compatibility as much as possible), but this section of documentation focuses on the new
functionality that bidirectional communication allows.
The low-level BiDi domains will be accessible in the code to the end user, but the goal is to provide
high-level APIs that are straightforward methods of real-world use cases. As such, the low-level
components will not be documented, and this section will focus only on the user-friendly
features that we encourage users to take advantage of.
If there is additional functionality you’d like to see, please raise a
feature request .
1 - WebDriver BiDi Logging Features These features are related to logging. Because “logging” can refer to so many different things, these methods are made available via a “script” namespace.
Remember that to use WebDriver BiDi, you must enable it in Options
Console Message Handlers Record or take actions on console.log
events.
Add Handler
Java
Python
CSharp
Ruby
JavaScript
Kotlin driver . script . add_console_message_handler ( log_entries . append )
driver . script . add_console_message_handler { | log | log_entries << log }
Remove Handler You need to store the ID returned when adding the handler to delete it.
Java
Python
CSharp
Ruby
JavaScript
Kotlin id = driver . script . add_console_message_handler ( log_entries . append )
driver . script . remove_console_message_handler ( id )
id = driver . script . add_console_message_handler { | log | log_entries << log }
driver . script . remove_console_message_handler ( id )
JavaScript Exception Handlers Record or take actions on JavaScript exception events.
Add Handler
Java
Python
CSharp
Ruby
JavaScript
Kotlin driver . script . add_javascript_error_handler ( log_entries . append )
driver . script . add_javascript_error_handler { | error | log_entries << error }
Remove Handler You need to store the ID returned when adding the handler to delete it.
Java
Python
CSharp
Ruby
JavaScript
Kotlin id = driver . script . add_javascript_error_handler ( log_entries . append )
driver . script . remove_javascript_error_handler ( id )
id = driver . script . add_javascript_error_handler { | error | log_entries << error }
driver . script . remove_javascript_error_handler ( id )
2 - WebDriver BiDi Network Features These features are related to networking, and are made available via a “network” namespace.
The implementation of these features is being tracked here: #13993
Remember that to use WebDriver BiDi, you must enable it in Options
Authentication Handlers Request Handlers Response Handlers 3 - WebDriver BiDi Script Features These features are related to scripts, and are made available via a “script” namespace.
The implementation of these features is being tracked here: #13992
Remember that to use WebDriver BiDi, you must enable it in Options
Script Pinning Execute Script DOM Mutation Handlers 4 - Chrome DevTools Protocol Examples of working with Chrome DevTools Protocol in Selenium. CDP support is temporary until WebDriver BiDi has been implemented.
Many browsers provide “DevTools” – a set of tools that are integrated with the browser that
developers can use to debug web apps and explore the performance of their pages. Google Chrome’s
DevTools make use of a protocol called the Chrome DevTools Protocol (or “CDP” for short).
As the name suggests, this is not designed for testing, nor to have a stable API, so functionality
is highly dependent on the version of the browser.
Selenium is working to implement a standards-based, cross-browser, stable alternative to CDP called
[WebDriver BiDi]. Until the support for this new protocol has finished, Selenium plans to provide access
to CDP features where applicable.
Chrome and Edge have a method to send basic CDP commands.
This does not work for features that require bidirectional communication, and you need to know what domains to enable when
and the exact names and types of domains/methods/parameters.
Java
Python
CSharp
Ruby
JavaScript
Kotlin Map < String , Object > cookie = new HashMap <> ();
cookie . put ( "name" , "cheese" );
cookie . put ( "value" , "gouda" );
cookie . put ( "domain" , "www.selenium.dev" );
cookie . put ( "secure" , true );
(( HasCdp ) driver ). executeCdpCommand ( "Network.setCookie" , cookie );
cookie = { 'name' : 'cheese' ,
'value' : 'gouda' ,
'domain' : 'www.selenium.dev' ,
'secure' : True }
driver . execute_cdp_cmd ( 'Network.setCookie' , cookie )
var cookie = new Dictionary < string , object >
{
{ "name" , "cheese" },
{ "value" , "gouda" },
{ "domain" , "www.selenium.dev" },
{ "secure" , true }
};
(( ChromeDriver ) driver ). ExecuteCdpCommand ( "Network.setCookie" , cookie );
driver . execute_cdp ( 'Network.setCookie' ,
name : 'cheese' ,
value : 'gouda' ,
domain : 'www.selenium.dev' ,
secure : true )
To make working with CDP easier, and to provide access to the more advanced features, Selenium bindings
automatically generate classes and methods for the most common domains.
CDP methods and implementations can change from version to version, though, so you want to keep the
version of Chrome and the version of DevTools matching. Selenium supports the 3 most
recent versions of Chrome at any given time,
and tries to time releases to ensure that access to the latest versions are available.
This limitation provides additional challenges for several bindings, where dynamically
generated CDP support requires users to regularly update their code to reference the proper version of CDP.
In some cases an idealized implementation has been created that should work for any version of CDP without the
user needing to change their code, but that is not always available.
Examples of how to use CDP in your Selenium tests can be found on the following pages, but
we want to call out a couple commonly cited examples that are of limited practical value.
Geo Location — almost all sites use the IP address to determine physical location,
so setting an emulated geolocation rarely has the desired effect.Overriding Device Metrics — Chrome provides a great API for setting Mobile Emulation
in the Options classes, which is generally superior to attempting to do this with CDP.4.1 - Chrome DevTools Logging Features Logging features using CDP.
While Selenium 4 provides direct access to the Chrome DevTools Protocol, these
methods will eventually be removed when WebDriver BiDi implemented.
Console Logs
Java
Python
CSharp
Ruby
JavaScript
Kotlin (( HasLogEvents ) driver ). onLogEvent ( consoleEvent ( e -> messages . add ( e . getMessages (). get ( 0 ))));
async with driver . bidi_connection () as session :
async with Log ( driver , session ) . add_listener ( Console . ALL ) as messages :
using IJavaScriptEngine monitor = new JavaScriptEngine ( driver );
var messages = new List < string >();
monitor . JavaScriptConsoleApiCalled += ( _ , e ) =>
{
messages . Add ( e . MessageContent );
};
await monitor . StartEventMonitoring ();
driver . on_log_event ( :console ) { | log | logs << log . args . first }
JavaScript Exceptions
Java
Python
CSharp
Ruby
JavaScript
Kotlin async with driver . bidi_connection () as session :
async with Log ( driver , session ) . add_js_error_listener () as messages :
using IJavaScriptEngine monitor = new JavaScriptEngine ( driver );
var messages = new List < string >();
monitor . JavaScriptExceptionThrown += ( _ , e ) =>
{
messages . Add ( e . Message );
};
await monitor . StartEventMonitoring ();
driver . on_log_event ( :exception ) { | exception | exceptions << exception }
4.2 - Chrome DevTools Network Features Network features using CDP.
While Selenium 4 provides direct access to the Chrome DevTools Protocol, these
methods will eventually be removed when WebDriver BiDi implemented.
Basic authentication Some applications make use of browser authentication to secure pages.
It used to be common to handle them in the URL, but browsers stopped supporting this.
With this code you can insert the credentials into the header when necessary
Java
Python
CSharp
Ruby
JavaScript
Kotlin Predicate < URI > uriPredicate = uri -> uri . toString (). contains ( "herokuapp.com" );
Supplier < Credentials > authentication = UsernameAndPassword . of ( "admin" , "admin" );
(( HasAuthentication ) driver ). register ( uriPredicate , authentication );
credentials = base64 . b64encode ( "admin:admin" . encode ()) . decode ()
auth = { 'authorization' : 'Basic ' + credentials }
await connection . session . execute ( connection . devtools . network . set_extra_http_headers ( Headers ( auth )))
var handler = new NetworkAuthenticationHandler ()
{
UriMatcher = uri => uri . AbsoluteUri . Contains ( "herokuapp" ),
Credentials = new PasswordCredentials ( "admin" , "admin" )
};
var networkInterceptor = driver . Manage (). Network ;
networkInterceptor . AddAuthenticationHandler ( handler );
await networkInterceptor . StartMonitoring ();
driver . register ( username : 'admin' ,
password : 'admin' ,
uri : /herokuapp/ )
Network Interception Both requests and responses can be recorded or transformed.
Java
Python
CSharp
Ruby
JavaScript
Kotlin try ( NetworkInterceptor ignored =
new NetworkInterceptor (
driver ,
( Filter )
next ->
req -> {
HttpResponse res = next . execute ( req );
contentType . add ( res . getHeader ( "Content-Type" ));
return res ;
})) {
INetwork networkInterceptor = driver . Manage (). Network ;
networkInterceptor . NetworkResponseReceived += ( _ , e ) =>
{
contentType . Add ( e . ResponseHeaders [ "content-type" ]);
};
await networkInterceptor . StartMonitoring ();
driver . intercept do | request , & continue |
continue . call ( request ) do | response |
content_type << response . headers [ 'content-type' ]
end
end
Java
Python
CSharp
Ruby
JavaScript
Kotlin try ( NetworkInterceptor ignored =
new NetworkInterceptor (
driver ,
Route . matching ( req -> true )
. to (
() ->
req ->
new HttpResponse ()
. setStatus ( 200 )
. addHeader ( "Content-Type" , MediaType . HTML_UTF_8 . toString ())
. setContent ( Contents . utf8String ( "Creamy, delicious cheese!" ))))) {
var handler = new NetworkResponseHandler ()
{
ResponseMatcher = _ => true ,
ResponseTransformer = _ => new HttpResponseData
{
StatusCode = 200 ,
Body = "Creamy, delicious cheese!"
}
};
INetwork networkInterceptor = driver . Manage (). Network ;
networkInterceptor . AddResponseHandler ( handler );
await networkInterceptor . StartMonitoring ();
driver . intercept do | request , & continue |
continue . call ( request ) do | response |
response . body = 'Creamy, delicious cheese!' if request . url . include? ( 'blank' )
end
end
Request interception
Java
Python
CSharp
Ruby
JavaScript
Kotlin try ( NetworkInterceptor ignored =
new NetworkInterceptor (
driver ,
( Filter )
next ->
req -> {
if ( req . getUri (). contains ( "one.js" )) {
req =
new HttpRequest (
HttpMethod . GET , req . getUri (). replace ( "one.js" , "two.js" ));
}
completed . set ( true );
return next . execute ( req );
})) {
var handler = new NetworkRequestHandler
{
RequestMatcher = request => request . Url . Contains ( "one.js" ),
RequestTransformer = request =>
{
request . Url = request . Url . Replace ( "one" , "two" );
return request ;
}
};
INetwork networkInterceptor = driver . Manage (). Network ;
networkInterceptor . AddRequestHandler ( handler );
await networkInterceptor . StartMonitoring ();
driver . intercept do | request , & continue |
uri = URI ( request . url )
request . url = uri . to_s . gsub ( 'one' , 'two' ) if uri . path &. end_with? ( 'one.js' )
continue . call ( request )
end
Java
Python
CSharp
Ruby
JavaScript
Kotlin devTools . send ( Performance . enable ( Optional . empty ()));
List < Metric > metricList = devTools . send ( Performance . getMetrics ());
async with driver . bidi_connection () as connection :
await connection . session . execute ( connection . devtools . performance . enable ())
metric_list = await connection . session . execute ( connection . devtools . performance . get_metrics ())
await domains . Performance . Enable ( new OpenQA . Selenium . DevTools . V126 . Performance . EnableCommandSettings ());
var metricsResponse =
await session . SendCommand < GetMetricsCommandSettings , GetMetricsCommandResponse >(
new GetMetricsCommandSettings ()
);
driver . devtools . performance . enable
metric_list = driver . devtools . performance . get_metrics . dig ( 'result' , 'metrics' )
Setting Cookies
Java
Python
CSharp
Ruby
JavaScript
Kotlin devTools . send (
Network . setCookie (
"cheese" ,
"gouda" ,
Optional . empty (),
Optional . of ( "www.selenium.dev" ),
Optional . empty (),
Optional . of ( true ),
Optional . empty (),
Optional . empty (),
Optional . empty (),
Optional . empty (),
Optional . empty (),
Optional . empty (),
Optional . empty (),
Optional . empty ()));
async with driver . bidi_connection () as connection :
execution = connection . devtools . network . set_cookie (
name = "cheese" ,
value = "gouda" ,
domain = "www.selenium.dev" ,
secure = True
)
await connection . session . execute ( execution )
var cookieCommandSettings = new SetCookieCommandSettings
{
Name = "cheese" ,
Value = "gouda" ,
Domain = "www.selenium.dev" ,
Secure = true
};
await domains . Network . SetCookie ( cookieCommandSettings );
driver . devtools . network . set_cookie ( name : 'cheese' ,
value : 'gouda' ,
domain : 'www.selenium.dev' ,
secure : true )
Waiting for Downloads
Java
Python
CSharp
Ruby
JavaScript
Kotlin devTools . send (
Browser . setDownloadBehavior (
Browser . SetDownloadBehaviorBehavior . ALLOWANDNAME ,
Optional . empty (),
Optional . of ( "" ),
Optional . of ( true )));
driver . devtools . browser . set_download_behavior ( behavior : 'allow' ,
download_path : '' ,
events_enabled : true )
driver . devtools . browser . on ( :download_progress ) do | progress |
@completed = progress [ 'state' ] == 'completed'
end
4.3 - Chrome DevTools Script Features Script features using CDP.
While Selenium 4 provides direct access to the Chrome DevTools Protocol, these
methods will eventually be removed when WebDriver BiDi implemented.
Script Pinning
Java
Python
CSharp
Ruby
JavaScript
Kotlin ScriptKey key = (( JavascriptExecutor ) driver ). pin ( "return arguments;" );
List < Object > arguments =
( List < Object > ) (( JavascriptExecutor ) driver ). executeScript ( key , 1 , true , element );
var key = await new JavaScriptEngine ( driver ). PinScript ( "return arguments;" );
var arguments = (( WebDriver ) driver ). ExecuteScript ( key , 1 , true , element );
key = driver . pin_script ( 'return arguments;' )
arguments = driver . execute_script ( key , 1 , true , element )
DOM Mutation Handlers
Java
Python
CSharp
Ruby
JavaScript
Kotlin async with driver . bidi_connection () as session :
async with Log ( driver , session ) . mutation_events () as event :
using IJavaScriptEngine monitor = new JavaScriptEngine ( driver );
monitor . DomMutated += ( _ , e ) =>
{
var locator = By . CssSelector ( $"*[data-__webdriver_id='{e.AttributeData.TargetId}']" );
mutations . Add ( driver . FindElement ( locator ));
};
await monitor . StartEventMonitoring ();
await monitor . EnableDomMutationMonitoring ();
driver . on_log_event ( :mutation ) { | mutation | mutations << mutation . element }
5 - BiDirectional API (W3C compliant) Examples of working with Chrome DevTools Protocol in Selenium. CDP support is temporary until WebDriver BiDi has been implemented.
The following list of APIs will be growing as the WebDriver BiDirectional Protocol grows
and browser vendors implement the same.
Additionally, Selenium will try to support real-world use cases that internally use a combination of W3C BiDi protocol APIs.
If there is additional functionality you’d like to see, please raise a
feature request .
5.1 - Browsing Context Commands This section contains the APIs related to browsing context commands.
Open a new window Creates a new browsing context in a new window.
Java
Ruby
JavaScript
Kotlin Selenium v4.8
void testCreateAWindow () {
BrowsingContext browsingContext = new BrowsingContext ( driver , WindowType . WINDOW );
Assertions . assertNotNull ( browsingContext . getId ());
}
Selenium v4.8
it ( 'test create a window' , async function () {
const browsingContext = await BrowsingContext ( driver , {
Open a new tab Creates a new browsing context in a new tab.
Java
Ruby
JavaScript
Kotlin Selenium v4.8
void testCreateATab () {
BrowsingContext browsingContext = new BrowsingContext ( driver , WindowType . TAB );
Assertions . assertNotNull ( browsingContext . getId ());
}
Selenium v4.8
it ( 'test create a tab' , async function () {
const browsingContext = await BrowsingContext ( driver , {
Use existing window handle Creates a browsing context for the existing tab/window to run commands.
Java
Ruby
JavaScript
Kotlin Selenium v4.8
void testCreateABrowsingContextForGivenId () {
String id = driver . getWindowHandle ();
BrowsingContext browsingContext = new BrowsingContext ( driver , id );
Assertions . assertEquals ( id , browsingContext . getId ());
}
Selenium v4.8
it ( 'test create a browsing context for given id' , async function () {
const id = await driver . getWindowHandle ()
const browsingContext = await BrowsingContext ( driver , {
Open a window with a reference browsing context A reference browsing context is a top-level browsing context .
The API allows to pass the reference browsing context, which is used to create a new window. The implementation is operating system specific.
Java
Ruby
JavaScript
Kotlin Selenium v4.8
void testCreateAWindowWithAReferenceContext () {
BrowsingContext
browsingContext =
new BrowsingContext ( driver , WindowType . WINDOW , driver . getWindowHandle ());
Assertions . assertNotNull ( browsingContext . getId ());
}
Selenium v4.8
it ( 'test create a window with a reference context' , async function () {
const browsingContext = await BrowsingContext ( driver , {
type : 'window' ,
Open a tab with a reference browsing context A reference browsing context is a top-level browsing context .
The API allows to pass the reference browsing context, which is used to create a new tab. The implementation is operating system specific.
Java
Ruby
JavaScript
Kotlin Selenium v4.8
void testCreateATabWithAReferenceContext () {
BrowsingContext
browsingContext =
new BrowsingContext ( driver , WindowType . TAB , driver . getWindowHandle ());
Assertions . assertNotNull ( browsingContext . getId ());
}
Selenium v4.8
it ( 'test create a tab with a reference context' , async function () {
const browsingContext = await BrowsingContext ( driver , {
type : 'tab' ,
Navigate to a URL
Java
Ruby
JavaScript
Kotlin Selenium v4.8
void testNavigateToAUrl () {
BrowsingContext browsingContext = new BrowsingContext ( driver , WindowType . TAB );
NavigationResult info = browsingContext . navigate ( "https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html" );
Assertions . assertNotNull ( browsingContext . getId ());
Assertions . assertNotNull ( info . getNavigationId ());
Assertions . assertTrue ( info . getUrl (). contains ( "/bidi/logEntryAdded.html" ));
}
Navigate to a URL with readiness state
Java
Ruby
JavaScript
Kotlin Selenium v4.8
void testNavigateToAUrlWithReadinessState () {
BrowsingContext browsingContext = new BrowsingContext ( driver , WindowType . TAB );
NavigationResult info = browsingContext . navigate ( "https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html" ,
ReadinessState . COMPLETE );
Assertions . assertNotNull ( browsingContext . getId ());
Assertions . assertNotNull ( info . getNavigationId ());
Assertions . assertTrue ( info . getUrl (). contains ( "/bidi/logEntryAdded.html" ));
}
Selenium v4.8
})
const info = await browsingContext . navigate (
'https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html' ,
Get browsing context tree Provides a tree of all browsing contexts descending from the parent browsing context, including the parent browsing context.
Java
Ruby
JavaScript
Kotlin Selenium v4.8
void testGetTreeWithAChild () {
String referenceContextId = driver . getWindowHandle ();
BrowsingContext parentWindow = new BrowsingContext ( driver , referenceContextId );
parentWindow . navigate ( "https://www.selenium.dev/selenium/web/iframes.html" , ReadinessState . COMPLETE );
List < BrowsingContextInfo > contextInfoList = parentWindow . getTree ();
Assertions . assertEquals ( 1 , contextInfoList . size ());
BrowsingContextInfo info = contextInfoList . get ( 0 );
Assertions . assertEquals ( 1 , info . getChildren (). size ());
Assertions . assertEquals ( referenceContextId , info . getId ());
Assertions . assertTrue ( info . getChildren (). get ( 0 ). getUrl (). contains ( "formPage.html" ));
}
Selenium v4.8
it ( 'test get tree with a child' , async function () {
const browsingContextId = await driver . getWindowHandle ()
const parentWindow = await BrowsingContext ( driver , {
browsingContextId : browsingContextId ,
})
await parentWindow . navigate ( 'https://www.selenium.dev/selenium/web/iframes.html' , 'complete' )
Get browsing context tree with depth Provides a tree of all browsing contexts descending from the parent browsing context, including the parent browsing context upto the depth value passed.
Java
Ruby
JavaScript
Kotlin Selenium v4.8
void testGetTreeWithDepth () {
String referenceContextId = driver . getWindowHandle ();
BrowsingContext parentWindow = new BrowsingContext ( driver , referenceContextId );
parentWindow . navigate ( "https://www.selenium.dev/selenium/web/iframes.html" , ReadinessState . COMPLETE );
List < BrowsingContextInfo > contextInfoList = parentWindow . getTree ( 0 );
Assertions . assertEquals ( 1 , contextInfoList . size ());
BrowsingContextInfo info = contextInfoList . get ( 0 );
Assertions . assertNull ( info . getChildren ()); // since depth is 0
Assertions . assertEquals ( referenceContextId , info . getId ());
}
Selenium v4.8
it ( 'test get tree with depth' , async function () {
const browsingContextId = await driver . getWindowHandle ()
const parentWindow = await BrowsingContext ( driver , {
browsingContextId : browsingContextId ,
})
await parentWindow . navigate ( 'https://www.selenium.dev/selenium/web/iframes.html' , 'complete' )
Get All Top level browsing contexts
Java
Ruby
JavaScript
Kotlin Selenium v4.8
void testGetAllTopLevelContexts () {
BrowsingContext window1 = new BrowsingContext ( driver , driver . getWindowHandle ());
BrowsingContext window2 = new BrowsingContext ( driver , WindowType . WINDOW );
List < BrowsingContextInfo > contextInfoList = window1 . getTopLevelContexts ();
Assertions . assertEquals ( 2 , contextInfoList . size ());
}
Selenium v4.20.0
it . skip ( 'Get All Top level browsing contexts' , async () => {
const id = await driver . getWindowHandle ()
const window1 = await BrowsingContext ( driver , {
browsingContextId : id ,
})
Close a tab/window
Java
Ruby
JavaScript
Kotlin Selenium v4.8
void testCloseAWindow () {
BrowsingContext window1 = new BrowsingContext ( driver , WindowType . WINDOW );
BrowsingContext window2 = new BrowsingContext ( driver , WindowType . WINDOW );
window2 . close ();
Assertions . assertThrows ( BiDiException . class , window2 :: getTree );
}
@Test
void testCloseATab () {
BrowsingContext tab1 = new BrowsingContext ( driver , WindowType . TAB );
BrowsingContext tab2 = new BrowsingContext ( driver , WindowType . TAB );
tab2 . close ();
Assertions . assertThrows ( BiDiException . class , tab2 :: getTree );
}
Selenium v4.8
it ( 'test close a window' , async function () {
const window1 = await BrowsingContext ( driver , { type : 'window' })
const window2 = await BrowsingContext ( driver , { type : 'window' })
Activate a browsing context
Java
Ruby
JavaScript
Kotlin Selenium v4.14.1
BrowsingContext window1 = new BrowsingContext ( driver , driver . getWindowHandle ());
BrowsingContext window2 = new BrowsingContext ( driver , WindowType . WINDOW );
window1 . activate ();
Selenium v4.15
it ( 'can activate a browsing context' , async function () {
const id = await driver . getWindowHandle ()
const window1 = await BrowsingContext ( driver , {
assert . equal ( result , false )
Reload a browsing context
Java
Ruby
JavaScript
Kotlin Selenium v4.13.0
BrowsingContext browsingContext = new BrowsingContext ( driver , WindowType . TAB );
browsingContext . navigate ( "https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html" , ReadinessState . COMPLETE );
NavigationResult reloadInfo = browsingContext . reload ( ReadinessState . INTERACTIVE );
Selenium v4.15
'https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html' , 'complete' )
Handle user prompt
Java
Ruby
JavaScript
Kotlin Selenium v4.13.0
BrowsingContext browsingContext = new BrowsingContext ( driver , driver . getWindowHandle ());
driver . get ( "https://www.selenium.dev/selenium/web/alerts.html" );
driver . findElement ( By . id ( "prompt-with-default" )). click ();
String userText = "Selenium automates browsers" ;
browsingContext . handleUserPrompt ( true , userText );
Selenium v4.15
const userText = 'Selenium automates browsers'
Capture Screenshot
Java
Ruby
JavaScript
Kotlin Selenium v4.13.0
BrowsingContext browsingContext = new BrowsingContext ( driver , driver . getWindowHandle ());
driver . get ( "https://www.selenium.dev/selenium/web/alerts.html" );
String screenshot = browsingContext . captureScreenshot ();
Capture Viewport Screenshot
Java
Ruby
JavaScript
Kotlin Selenium v4.14.0
BrowsingContext browsingContext = new BrowsingContext ( driver , driver . getWindowHandle ());
driver . get ( "https://www.selenium.dev/selenium/web/coordinates_tests/simple_page.html" );
WebElement element = driver . findElement ( By . id ( "box" ));
Rectangle elementRectangle = element . getRect ();
String screenshot =
browsingContext . captureBoxScreenshot (
elementRectangle . getX (), elementRectangle . getY (), 5 , 5 );
Selenium v4.15
it ( 'can take box screenshot' , async function () {
const id = await driver . getWindowHandle ()
const browsingContext = await BrowsingContext ( driver , {
browsingContextId : id ,
})
Capture Element Screenshot
Java
Ruby
JavaScript
Kotlin Selenium v4.14.0
BrowsingContext browsingContext = new BrowsingContext ( driver , driver . getWindowHandle ());
driver . get ( "https://www.selenium.dev/selenium/web/formPage.html" );
WebElement element = driver . findElement ( By . id ( "checky" ));
String screenshot = browsingContext . captureElementScreenshot ((( RemoteWebElement ) element ). getId ());
Selenium v4.15
const element = await driver . findElement ( By . id ( 'checky' ))
Set Viewport
Java
Ruby
JavaScript
Kotlin Selenium v4.14.1
BrowsingContext browsingContext = new BrowsingContext ( driver , driver . getWindowHandle ());
driver . get ( "https://www.selenium.dev/selenium/web/formPage.html" );
browsingContext . setViewport ( 250 , 300 , 5 );
Selenium v4.15
await driver . get ( "https://www.selenium.dev/selenium/web/blank.html" )
Print page
Java
Ruby
JavaScript
Kotlin Selenium v4.14.1
BrowsingContext browsingContext = new BrowsingContext ( driver , driver . getWindowHandle ());
driver . get ( "https://www.selenium.dev/selenium/web/formPage.html" );
PrintOptions printOptions = new PrintOptions ();
String printPage = browsingContext . print ( printOptions );
Selenium v4.10
await driver . get ( "https://www.selenium.dev/selenium/web/printPage.html" )
const result = await browsingContext . printPage ({
orientation : 'landscape' ,
scale : 1 ,
background : true ,
width : 30 ,
height : 30 ,
top : 1 ,
bottom : 1 ,
left : 1 ,
right : 1 ,
shrinkToFit : true ,
Navigate back
Java
Ruby
JavaScript
Kotlin Selenium v4.16.0
BrowsingContext browsingContext = new BrowsingContext ( driver , driver . getWindowHandle ());
browsingContext . navigate ( "https://www.selenium.dev/selenium/web/formPage.html" , ReadinessState . COMPLETE );
wait . until ( visibilityOfElementLocated ( By . id ( "imageButton" ))). submit ();
wait . until ( titleIs ( "We Arrive Here" ));
browsingContext . back ();
Selenium v4.17
await driver . wait ( until . titleIs ( 'We Arrive Here' ), 2500 )
Navigate forward
Java
Ruby
JavaScript
Kotlin Selenium v4.16.0
void canNavigateForwardInTheBrowserHistory () {
BrowsingContext browsingContext = new BrowsingContext ( driver , driver . getWindowHandle ());
browsingContext . navigate ( "https://www.selenium.dev/selenium/web/formPage.html" , ReadinessState . COMPLETE );
wait . until ( visibilityOfElementLocated ( By . id ( "imageButton" ))). submit ();
wait . until ( titleIs ( "We Arrive Here" ));
browsingContext . back ();
Assertions . assertTrue ( driver . getPageSource (). contains ( "We Leave From Here" ));
browsingContext . forward ();
Selenium v4.17
assert . equal ( source . includes ( 'We Leave From Here' ), true )
Traverse history
Java
Ruby
JavaScript
Kotlin Selenium v4.16.0
BrowsingContext browsingContext = new BrowsingContext ( driver , driver . getWindowHandle ());
browsingContext . navigate ( "https://www.selenium.dev/selenium/web/formPage.html" , ReadinessState . COMPLETE );
wait . until ( visibilityOfElementLocated ( By . id ( "imageButton" ))). submit ();
wait . until ( titleIs ( "We Arrive Here" ));
browsingContext . traverseHistory ( - 1 );
Selenium v4.17
await driver . wait ( until . titleIs ( 'We Arrive Here' ), 2500 )
Events This section contains the APIs related to browsing context events.
Browsing Context Created Event
Java
Ruby
JavaScript
Kotlin Selenium v4.10
try ( BrowsingContextInspector inspector = new BrowsingContextInspector ( driver )) {
CompletableFuture < BrowsingContextInfo > future = new CompletableFuture <> ();
inspector . onBrowsingContextCreated ( future :: complete );
String windowHandle = driver . switchTo (). newWindow ( WindowType . WINDOW ). getWindowHandle ();
BrowsingContextInfo browsingContextInfo = future . get ( 5 , TimeUnit . SECONDS );
Selenium v4.9.2
let contextInfo = null
const browsingContextInspector = await BrowsingContextInspector ( driver )
await browsingContextInspector . onBrowsingContextCreated (( entry ) => {
contextInfo = entry
})
Dom Content loaded Event
Java
Ruby
JavaScript
Kotlin Selenium v4.10
String windowHandle = driver . switchTo (). newWindow ( WindowType . TAB ). getWindowHandle ();
BrowsingContextInfo browsingContextInfo = future . get ( 5 , TimeUnit . SECONDS );
Assertions . assertEquals ( windowHandle , browsingContextInfo . getId ());
}
}
@Test
void canListenToDomContentLoadedEvent ()
Selenium v4.9.2
it ( 'can listen to dom content loaded event' , async function () {
const browsingContextInspector = await BrowsingContextInspector ( driver )
let navigationInfo = null
await browsingContextInspector . onDomContentLoaded (( entry ) => {
navigationInfo = entry
})
const browsingContext = await BrowsingContext ( driver , {
browsingContextId : await driver . getWindowHandle (),
})
Browsing Context Loaded Event
Java
Ruby
JavaScript
Kotlin Selenium v4.10
try ( BrowsingContextInspector inspector = new BrowsingContextInspector ( driver )) {
CompletableFuture < NavigationInfo > future = new CompletableFuture <> ();
inspector . onBrowsingContextLoaded ( future :: complete );
BrowsingContext context = new BrowsingContext ( driver , driver . getWindowHandle ());
context . navigate ( "https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html" , ReadinessState . COMPLETE );
NavigationInfo navigationInfo = future . get ( 5 , TimeUnit . SECONDS );
Selenium v4.9.2
let navigationInfo = null
const browsingContextInspector = await BrowsingContextInspector ( driver )
await browsingContextInspector . onBrowsingContextLoaded (( entry ) => {
navigationInfo = entry
})
const browsingContext = await BrowsingContext ( driver , {
browsingContextId : await driver . getWindowHandle (),
})
Navigated Started Event
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( BrowsingContextInspector inspector = new BrowsingContextInspector ( driver )) {
CompletableFuture < NavigationInfo > future = new CompletableFuture <> ();
inspector . onNavigationStarted ( future :: complete );
BrowsingContext context = new BrowsingContext ( driver , driver . getWindowHandle ());
context . navigate ( "https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html" , ReadinessState . COMPLETE );
NavigationInfo navigationInfo = future . get ( 5 , TimeUnit . SECONDS );
Fragment Navigated Event
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( BrowsingContextInspector inspector = new BrowsingContextInspector ( driver )) {
CompletableFuture < NavigationInfo > future = new CompletableFuture <> ();
BrowsingContext context = new BrowsingContext ( driver , driver . getWindowHandle ());
context . navigate ( "https://www.selenium.dev/selenium/web/linked_image.html" , ReadinessState . COMPLETE );
inspector . onFragmentNavigated ( future :: complete );
context . navigate ( "https://www.selenium.dev/selenium/web/linked_image.html#linkToAnchorOnThisPage" , ReadinessState . COMPLETE );
NavigationInfo navigationInfo = future . get ( 5 , TimeUnit . SECONDS );
Selenium v4.15.0
let navigationInfo = null
const browsingContextInspector = await BrowsingContextInspector ( driver )
const browsingContext = await BrowsingContext ( driver , {
browsingContextId : await driver . getWindowHandle (),
})
await browsingContext . navigate ( 'https://www.selenium.dev/selenium/web/linked_image.html' , 'complete' )
await browsingContextInspector . onFragmentNavigated (( entry ) => {
navigationInfo = entry
})
User Prompt Opened Event
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( BrowsingContextInspector inspector = new BrowsingContextInspector ( driver )) {
CompletableFuture < NavigationInfo > future = new CompletableFuture <> ();
BrowsingContext context = new BrowsingContext ( driver , driver . getWindowHandle ());
context . navigate ( "https://www.selenium.dev/selenium/web/linked_image.html" , ReadinessState . COMPLETE );
inspector . onFragmentNavigated ( future :: complete );
context . navigate ( "https://www.selenium.dev/selenium/web/linked_image.html#linkToAnchorOnThisPage" , ReadinessState . COMPLETE );
NavigationInfo navigationInfo = future . get ( 5 , TimeUnit . SECONDS );
User Prompt Closed Event
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( BrowsingContextInspector inspector = new BrowsingContextInspector ( driver )) {
CompletableFuture < UserPromptClosed > future = new CompletableFuture <> ();
BrowsingContext context = new BrowsingContext ( driver , driver . getWindowHandle ());
inspector . onUserPromptClosed ( future :: complete );
driver . get ( "https://www.selenium.dev/selenium/web/alerts.html" );
driver . findElement ( By . id ( "prompt" )). click ();
context . handleUserPrompt ( true , "selenium" );
UserPromptClosed userPromptClosed = future . get ( 5 , TimeUnit . SECONDS );
Assertions . assertEquals ( context . getId (), userPromptClosed . getBrowsingContextId ());
Browsing Context Destroyed Event
Java
Ruby
JavaScript
Kotlin Selenium v4.18
try ( BrowsingContextInspector inspector = new BrowsingContextInspector ( driver )) {
CompletableFuture < BrowsingContextInfo > future = new CompletableFuture <> ();
inspector . onBrowsingContextDestroyed ( future :: complete );
String windowHandle = driver . switchTo (). newWindow ( WindowType . WINDOW ). getWindowHandle ();
driver . close ();
BrowsingContextInfo browsingContextInfo = future . get ( 5 , TimeUnit . SECONDS );
Assertions . assertEquals ( windowHandle , browsingContextInfo . getId ());
Selenium v4.18.0
let contextInfo = null
const browsingContextInspector = await BrowsingContextInspector ( driver )
await browsingContextInspector . onBrowsingContextDestroyed (( entry ) => {
contextInfo = entry
})
await driver . switchTo (). newWindow ( 'window' )
const windowHandle = await driver . getWindowHandle ()
5.2 - Input This section contains the APIs related to input commands.
Java
Ruby
JavaScript
Kotlin Selenium v4.17
Actions selectThreeOptions =
actions . click ( options . get ( 1 )). keyDown ( Keys . SHIFT ). click ( options . get ( 3 )). keyUp ( Keys . SHIFT );
input . perform ( windowHandle , selectThreeOptions . getSequences ());
Selenium v4.17
let options = await driver . findElements ( By . tagName ( 'option' ))
const actions = driver . actions (). click ( options [ 1 ]). keyDown ( Key . SHIFT ). click ( options [ 3 ]). keyUp ( Key . SHIFT ). getSequences ()
Release Actions
Java
Ruby
JavaScript
Kotlin Selenium v4.17
Actions sendLowercase =
new Actions ( driver ). keyDown ( inputTextBox , "a" ). keyDown ( inputTextBox , "b" );
input . perform ( windowHandle , sendLowercase . getSequences ());
(( JavascriptExecutor ) driver ). executeScript ( "resetEvents()" );
input . release ( windowHandle );
Selenium v4.17
await driver . executeScript ( 'resetEvents()' )
5.3 - Log This section contains the APIs related to logging.
Console logs Listen to the console.log
events and register callbacks to process the event.
Java
Ruby
JavaScript
Kotlin Selenium v4.8
public void jsErrors () {
CopyOnWriteArrayList < ConsoleLogEntry > logs = new CopyOnWriteArrayList <> ();
try ( LogInspector logInspector = new LogInspector ( driver )) {
logInspector . onConsoleEntry ( logs :: add );
}
driver . get ( "https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html" );
const inspector = await LogInspector ( driver )
await inspector . onConsoleEntry ( function ( log ) {
logEntry = log
})
await driver . get ( 'https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html' )
await driver . findElement ({ id : 'consoleLog' }). click ()
assert . equal ( logEntry . text , 'Hello, world!' )
assert . equal ( logEntry . realm , null )
assert . equal ( logEntry . type , 'console' )
assert . equal ( logEntry . level , 'info' )
assert . equal ( logEntry . method , 'log' )
assert . equal ( logEntry . stackTrace , null )
assert . equal ( logEntry . args . length , 1 )
JavaScript exceptions Listen to the JS Exceptions
and register callbacks to process the exception details.
Java
Ruby
JavaScript
Kotlin logInspector . onJavaScriptLog ( future :: complete );
driver . get ( "https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html" );
driver . findElement ( By . id ( "jsException" )). click ();
JavascriptLogEntry logEntry = future . get ( 5 , TimeUnit . SECONDS );
Assertions . assertEquals ( "Error: Not working" , logEntry . getText ());
const inspector = await LogInspector ( driver )
await inspector . onJavascriptException ( function ( log ) {
logEntry = log
})
await driver . get ( 'https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html' )
await driver . findElement ({ id : 'jsException' }). click ()
assert . equal ( logEntry . text , 'Error: Not working' )
assert . equal ( logEntry . type , 'javascript' )
assert . equal ( logEntry . level , 'error' )
Listen to JS Logs Listen to all JS logs at all levels and register callbacks to process the log.
Java
Ruby
JavaScript
Kotlin Selenium v4.8
driver . findElement ( By . id ( "consoleLog" )). click ();
ConsoleLogEntry logEntry = future . get ( 5 , TimeUnit . SECONDS );
Assertions . assertEquals ( "Hello, world!" , logEntry . getText ());
Assertions . assertNull ( logEntry . getRealm ());
Assertions . assertEquals ( 1 , logEntry . getArgs (). size ());
Assertions . assertEquals ( "console" , logEntry . getType ());
5.4 - Network Commands This section contains the APIs related to network commands.
Add network intercept
Java
Ruby
JavaScript
Kotlin Selenium v4.18
try ( Network network = new Network ( driver )) {
String intercept =
network . addIntercept ( new AddInterceptParameters ( InterceptPhase . BEFORE_REQUEST_SENT ));
Selenium v4.18
const intercept = await network . addIntercept ( new AddInterceptParameters ( InterceptPhase . BEFORE_REQUEST_SENT ))
Remove network intercept
Java
Ruby
JavaScript
Kotlin Selenium v4.18
try ( Network network = new Network ( driver )) {
String intercept =
network . addIntercept ( new AddInterceptParameters ( InterceptPhase . BEFORE_REQUEST_SENT ));
Assertions . assertNotNull ( intercept );
network . removeIntercept ( intercept );
Selenium v4.18
const network = await Network ( driver )
const intercept = await network . addIntercept ( new AddInterceptParameters ( InterceptPhase . BEFORE_REQUEST_SENT ))
Continue request blocked at authRequired phase with credentials
Java
Ruby
JavaScript
Kotlin Selenium v4.18
try ( Network network = new Network ( driver )) {
network . addIntercept ( new AddInterceptParameters ( InterceptPhase . AUTH_REQUIRED ));
network . onAuthRequired (
responseDetails ->
network . continueWithAuth (
responseDetails . getRequest (). getRequestId (),
new UsernameAndPassword ( "admin" , "admin" )));
driver . get ( "https://the-internet.herokuapp.com/basic_auth" );
Selenium v4.18
await network . addIntercept ( new AddInterceptParameters ( InterceptPhase . AUTH_REQUIRED ))
await network . authRequired ( async ( event ) => {
await network . continueWithAuth ( event . request . request , 'admin' , 'admin' )
})
Continue request blocked at authRequired phase without credentials
Java
Ruby
JavaScript
Kotlin Selenium v4.18
try ( Network network = new Network ( driver )) {
network . addIntercept ( new AddInterceptParameters ( InterceptPhase . AUTH_REQUIRED ));
network . onAuthRequired (
responseDetails ->
// Does not handle the alert
network . continueWithAuthNoCredentials ( responseDetails . getRequest (). getRequestId ()));
driver . get ( "https://the-internet.herokuapp.com/basic_auth" );
Selenium v4.18
await network . addIntercept ( new AddInterceptParameters ( InterceptPhase . AUTH_REQUIRED ))
await network . authRequired ( async ( event ) => {
await network . continueWithAuthNoCredentials ( event . request . request )
})
Cancel request blocked at authRequired phase
Java
Ruby
JavaScript
Kotlin Selenium v4.18
try ( Network network = new Network ( driver )) {
network . addIntercept ( new AddInterceptParameters ( InterceptPhase . AUTH_REQUIRED ));
network . onAuthRequired (
responseDetails ->
// Does not handle the alert
network . cancelAuth ( responseDetails . getRequest (). getRequestId ()));
driver . get ( "https://the-internet.herokuapp.com/basic_auth" );
Selenium v4.18
await network . addIntercept ( new AddInterceptParameters ( InterceptPhase . AUTH_REQUIRED ))
await network . authRequired ( async ( event ) => {
await network . cancelAuth ( event . request . request )
})
Fail request
Java
Ruby
JavaScript
Kotlin Selenium v4.18
try ( Network network = new Network ( driver )) {
network . addIntercept ( new AddInterceptParameters ( InterceptPhase . BEFORE_REQUEST_SENT ));
network . onBeforeRequestSent (
responseDetails -> network . failRequest ( responseDetails . getRequest (). getRequestId ()));
driver . manage (). timeouts (). pageLoadTimeout ( Duration . of ( 5 , ChronoUnit . SECONDS ));
Events This section contains the APIs related to network events.
Before Request Sent
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( Network network = new Network ( driver )) {
CompletableFuture < BeforeRequestSent > future = new CompletableFuture <> ();
network . onBeforeRequestSent ( future :: complete );
driver . get ( "https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html" );
BeforeRequestSent requestSent = future . get ( 5 , TimeUnit . SECONDS );
Selenium v4.18
let beforeRequestEvent = null
const network = await Network ( driver )
await network . beforeRequestSent ( function ( event ) {
beforeRequestEvent = event
})
await driver . get ( 'https://www.selenium.dev/selenium/web/blank.html' )
Response Started
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( Network network = new Network ( driver )) {
CompletableFuture < ResponseDetails > future = new CompletableFuture <> ();
network . onResponseStarted ( future :: complete );
driver . get ( "https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html" );
ResponseDetails response = future . get ( 5 , TimeUnit . SECONDS );
String windowHandle = driver . getWindowHandle ();
Selenium v4.18
let onResponseStarted = []
const network = await Network ( driver )
await network . responseStarted ( function ( event ) {
onResponseStarted . push ( event )
})
await driver . get ( 'https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html' )
Response Completed
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( Network network = new Network ( driver )) {
CompletableFuture < ResponseDetails > future = new CompletableFuture <> ();
network . onResponseCompleted ( future :: complete );
driver . get ( "https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html" );
ResponseDetails response = future . get ( 5 , TimeUnit . SECONDS );
String windowHandle = driver . getWindowHandle ();
Selenium v4.18
let onResponseCompleted = []
const network = await Network ( driver )
await network . responseCompleted ( function ( event ) {
onResponseCompleted . push ( event )
})
await driver . get ( 'https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html' )
Auth Required
Java
Ruby
JavaScript
Kotlin Selenium v4.17
try ( Network network = new Network ( driver )) {
CompletableFuture < ResponseDetails > future = new CompletableFuture <> ();
network . onAuthRequired ( future :: complete );
driver . get ( "https://the-internet.herokuapp.com/basic_auth" );
ResponseDetails response = future . get ( 5 , TimeUnit . SECONDS );
5.5 - Script Commands This section contains the APIs related to script commands.
Call function in a browsing context
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( Script script = new Script ( id , driver )) {
List < LocalValue > arguments = new ArrayList <> ();
arguments . add ( PrimitiveProtocolValue . numberValue ( 22 ));
Map < Object , LocalValue > value = new HashMap <> ();
value . put ( "some_property" , LocalValue . numberValue ( 42 ));
LocalValue thisParameter = LocalValue . objectValue ( value );
arguments . add ( thisParameter );
EvaluateResult result =
script . callFunctionInBrowsingContext (
id ,
"function processWithPromise(argument) {\n"
+ " return new Promise((resolve, reject) => {\n"
+ " setTimeout(() => {\n"
+ " resolve(argument + this.some_property);\n"
+ " }, 1000)\n"
+ " })\n"
+ "}" ,
true ,
Optional . of ( arguments ),
Optional . of ( thisParameter ),
Optional . of ( ResultOwnership . ROOT ));
Selenium v4.9
const manager = await ScriptManager ( id , driver )
let argumentValues = []
let value = new ArgumentValue ( LocalValue . createNumberValue ( 22 ))
argumentValues . push ( value )
let mapValue = { some_property : LocalValue . createNumberValue ( 42 )}
let thisParameter = new ArgumentValue ( LocalValue . createObjectValue ( mapValue )). asMap ()
const result = await manager . callFunctionInBrowsingContext (
id ,
'function processWithPromise(argument) {' +
'return new Promise((resolve, reject) => {' +
'setTimeout(() => {' +
'resolve(argument + this.some_property);' +
'}, 1000)' +
'})' +
'}' ,
true ,
argumentValues ,
thisParameter ,
ResultOwnership . ROOT )
Call function in a sandbox
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( Script script = new Script ( id , driver )) {
EvaluateResult result =
script . callFunctionInBrowsingContext (
id ,
"sandbox" ,
"() => window.foo" ,
true ,
Optional . empty (),
Optional . empty (),
Optional . empty ());
Selenium v4.9
const manager = await ScriptManager ( id , driver )
await manager . callFunctionInBrowsingContext ( id , '() => { window.foo = 2; }' , true , null , null , null , 'sandbox' )
Call function in a realm
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( Script script = new Script ( tab , driver )) {
List < RealmInfo > realms = script . getAllRealms ();
String realmId = realms . get ( 0 ). getRealmId ();
EvaluateResult result = script . callFunctionInRealm (
realmId ,
"() => { window.foo = 3; }" ,
true ,
Optional . empty (),
Optional . empty (),
Optional . empty ());
Selenium v4.9
const manager = await ScriptManager ( firstTab , driver )
const realms = await manager . getAllRealms ()
const realmId = realms [ 0 ]. realmId
await manager . callFunctionInRealm ( realmId , '() => { window.foo = 3; }' , true )
Evaluate script in a browsing context
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( Script script = new Script ( id , driver )) {
EvaluateResult result =
script . evaluateFunctionInBrowsingContext ( id , "1 + 2" , true , Optional . empty ());
Selenium v4.9
const manager = await ScriptManager ( id , driver )
const result = await manager . evaluateFunctionInBrowsingContext ( id , '1 + 2' , true )
Evaluate script in a sandbox
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( Script script = new Script ( id , driver )) {
EvaluateResult result =
script . evaluateFunctionInBrowsingContext (
id , "sandbox" , "window.foo" , true , Optional . empty ());
Selenium v4.9
const manager = await ScriptManager ( id , driver )
await manager . evaluateFunctionInBrowsingContext ( id , 'window.foo = 2' , true , null , 'sandbox' )
const resultInSandbox = await manager . evaluateFunctionInBrowsingContext ( id , 'window.foo' , true , null , 'sandbox' )
Evaluate script in a realm
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( Script script = new Script ( tab , driver )) {
List < RealmInfo > realms = script . getAllRealms ();
String realmId = realms . get ( 0 ). getRealmId ();
EvaluateResult result =
script . evaluateFunctionInRealm (
realmId , "window.foo" , true , Optional . empty ());
Selenium v4.9
const manager = await ScriptManager ( firstTab , driver )
const realms = await manager . getAllRealms ()
const realmId = realms [ 0 ]. realmId
await manager . evaluateFunctionInRealm ( realmId , 'window.foo = 3' , true )
const result = await manager . evaluateFunctionInRealm ( realmId , 'window.foo' , true )
Disown handles in a browsing context
Java
Ruby
JavaScript
Kotlin Selenium v4.15
script . disownBrowsingContextScript (
Selenium v4.9
await manager . disownBrowsingContextScript ( id , boxId )
Disown handles in a realm
Java
Ruby
JavaScript
Kotlin Selenium v4.15
script . disownRealmScript ( realmId , List . of ( boxId ));
Selenium v4.9
await manager . disownRealmScript ( realmId , boxId )
Get all realms
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( Script script = new Script ( firstWindow , driver )) {
List < RealmInfo > realms = script . getAllRealms ();
Selenium v4.9
const manager = await ScriptManager ( firstWindow , driver )
const realms = await manager . getAllRealms ()
Get realm by type
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( Script script = new Script ( firstWindow , driver )) {
List < RealmInfo > realms = script . getRealmsByType ( RealmType . WINDOW );
Selenium v4.9
const manager = await ScriptManager ( firstWindow , driver )
const realms = await manager . getRealmsByType ( RealmType . WINDOW )
Get browsing context realms
Java
Ruby
JavaScript
Kotlin Selenium v4.15
try ( Script script = new Script ( windowId , driver )) {
List < RealmInfo > realms = script . getRealmsInBrowsingContext ( tabId );
Selenium v4.9
const manager = await ScriptManager ( windowId , driver )
const realms = await manager . getRealmsInBrowsingContext ( tabId )
Get browsing context realms by type
Java
Ruby
JavaScript
Kotlin Selenium v4.15
List < RealmInfo > windowRealms =
script . getRealmsInBrowsingContextByType ( windowId , RealmType . WINDOW );
Selenium v4.9
const realms = await manager . getRealmsInBrowsingContextByType ( windowId , RealmType . WINDOW )
Preload a script
Java
Ruby
JavaScript
Kotlin Selenium v4.15
String id = script . addPreloadScript ( "() => { window.bar=2; }" , "sandbox" );
Selenium v4.10
const manager = await ScriptManager ( id , driver )
const scriptId = await manager . addPreloadScript ( '() => {{ console.log(\'{preload_script_console_text}\') }}' )
Remove a preloaded script
Java
Ruby
JavaScript
Kotlin Selenium v4.15
script . removePreloadScript ( id );
Selenium v4.10
await manager . removePreloadScript ( scriptId )
Events This section contains the APIs related to script events.
Message
Java
Ruby
JavaScript
Kotlin Selenium v4.16
try ( Script script = new Script ( driver )) {
CompletableFuture < Message > future = new CompletableFuture <> ();
script . onMessage ( future :: complete );
script . callFunctionInBrowsingContext (
driver . getWindowHandle (),
"(channel) => channel('foo')" ,
false ,
Optional . of ( List . of ( LocalValue . channelValue ( "channel_name" ))),
Optional . empty (),
Optional . empty ());
Message message = future . get ( 5 , TimeUnit . SECONDS );
Assertions . assertEquals ( "channel_name" , message . getChannel ());
}
Selenium v4.18
const manager = await ScriptManager ( undefined , driver )
let message = null
await manager . onMessage (( m ) => {
message = m
})
let argumentValues = []
let value = new ArgumentValue ( LocalValue . createChannelValue ( new ChannelValue ( 'channel_name' )))
argumentValues . push ( value )
const result = await manager . callFunctionInBrowsingContext (
await driver . getWindowHandle (),
'(channel) => channel("foo")' ,
false ,
argumentValues ,
)
Realm Created
Java
Ruby
JavaScript
Kotlin Selenium v4.16
try ( Script script = new Script ( driver )) {
CompletableFuture < RealmInfo > future = new CompletableFuture <> ();
script . onRealmCreated ( future :: complete );
BrowsingContext context = new BrowsingContext ( driver , driver . getWindowHandle ());
context . navigate ( "https://www.selenium.dev/selenium/blankPage" );
RealmInfo realmInfo = future . get ( 5 , TimeUnit . SECONDS );
Assertions . assertNotNull ( realmInfo . getRealmId ());
Assertions . assertEquals ( RealmType . WINDOW , realmInfo . getRealmType ());
}
Selenium v4.18
const manager = await ScriptManager ( undefined , driver )
let realmInfo = null
await manager . onRealmCreated (( result ) => {
realmInfo = result
})
const id = await driver . getWindowHandle ()
const browsingContext = await BrowsingContext ( driver , {
browsingContextId : id ,
})
await browsingContext . navigate ( 'https://www.selenium.dev/selenium/web/blank' , 'complete' )
Realm Destroyed
Java
Ruby
JavaScript
Kotlin Selenium v4.16
try ( Script script = new Script ( driver )) {
CompletableFuture < RealmInfo > future = new CompletableFuture <> ();
script . onRealmDestroyed ( future :: complete );
BrowsingContext context = new BrowsingContext ( driver , driver . getWindowHandle ());
context . close ();
RealmInfo realmInfo = future . get ( 5 , TimeUnit . SECONDS );
Assertions . assertNotNull ( realmInfo . getRealmId ());
Assertions . assertEquals ( RealmType . WINDOW , realmInfo . getRealmType ());
}
Selenium v4.19
const manager = await ScriptManager ( undefined , driver )
let realmInfo = null
await manager . onRealmDestroyed (( result ) => {
realmInfo = result
})
const id = await driver . getWindowHandle ()
const browsingContext = await BrowsingContext ( driver , {
browsingContextId : id ,
})
await browsingContext . close ()