Chrome DevTools Protocol (CDP) bindings for Selenium WebDriver version 138
—
JavaScript execution environment management and bidirectional communication setup for Chrome DevTools Protocol v138. Provides script injection, binding management, and page-level script control with full type safety.
Main JavaScript handler providing execution environment management and binding capabilities.
/**
* JavaScript execution and binding management for CDP v138
* @param devtools DevTools connection for JavaScript operations
*/
public class v138Javascript extends Javascript<ScriptIdentifier, BindingCalled> {
public v138Javascript(DevTools devtools);
// Public API methods inherited from Javascript base class
public void disable();
public ScriptId pin(String exposeScriptAs, String script);
public void addBindingCalledListener(Consumer<String> listener);
public void addJsBinding(String scriptName);
public void removeJsBinding(String scriptName);
}Usage Example:
import org.openqa.selenium.devtools.v138.v138Javascript;
import org.openqa.selenium.devtools.DevTools;
v138Javascript js = new v138Javascript(devTools);
// Add a JavaScript binding using public API
js.addJsBinding("myFunction");
// Listen for binding calls
js.addBindingCalledListener(payload -> {
System.out.println("Received from JavaScript: " + payload);
});
// Pin a script for execution
ScriptId scriptId = js.pin("initScript", "window.myApp = { ready: true };");High-level methods for JavaScript binding and script management without dealing with raw CDP commands.
/**
* Add a JavaScript binding to enable communication from JavaScript to Java
* @param scriptName Name of the binding function available in JavaScript
*/
public void addJsBinding(String scriptName);
/**
* Remove a previously added JavaScript binding
* @param scriptName Name of the binding to remove
*/
public void removeJsBinding(String scriptName);
/**
* Add listener for binding calls from JavaScript
* @param listener Consumer that receives binding payloads as strings
*/
public void addBindingCalledListener(Consumer<String> listener);
/**
* Pin a script to be evaluated and store reference for management
* @param exposeScriptAs Name to expose the script as
* @param script JavaScript code to pin
* @return ScriptId for managing the pinned script
*/
public ScriptId pin(String exposeScriptAs, String script);
/**
* Disable JavaScript domain and clean up resources
*/
public void disable();Usage Example:
v138Javascript js = new v138Javascript(devTools);
// Set up bidirectional communication
js.addJsBinding("sendToJava");
js.addBindingCalledListener(payload -> {
System.out.println("JavaScript sent: " + payload);
// Parse and handle the payload
if (payload.contains("ready")) {
System.out.println("JavaScript application is ready");
}
});
// Pin initialization script
ScriptId initId = js.pin("appInit",
"window.sendToJava('Application initialized');");
// Navigate - pinned script will execute
driver.get("https://example.com");
// Clean up when done
js.removeJsBinding("sendToJava");
js.disable();Manages the Runtime domain required for JavaScript execution and binding.
/**
* Enable Runtime domain for JavaScript operations
* @return Command to enable runtime domain
*/
@Override
protected Command<Void> enableRuntime();
/**
* Disable Runtime domain
* @return Command to disable runtime domain
*/
@Override
protected Command<Void> disableRuntime();Manages the Page domain required for script injection and page-level operations.
/**
* Enable Page domain for script injection
* @return Command to enable page domain
*/
@Override
protected Command<Void> enablePage();
/**
* Disable Page domain
* @return Command to disable page domain
*/
@Override
protected Command<Void> disablePage();Creates bidirectional communication channels between Java and JavaScript.
/**
* Add a JavaScript binding to communicate with Java
* @param scriptName Name of the binding function available in JavaScript
* @return Command to add the binding
*/
@Override
protected Command<Void> doAddJsBinding(String scriptName);
/**
* Remove a previously added JavaScript binding
* @param scriptName Name of the binding to remove
* @return Command to remove the binding
*/
@Override
protected Command<Void> doRemoveJsBinding(String scriptName);Usage Example:
// Add binding for bidirectional communication
devTools.send(js.doAddJsBinding("sendToJava"));
// Listen for binding calls from JavaScript
devTools.addListener(js.bindingCalledEvent(), event -> {
String payload = js.extractPayload(event);
System.out.println("Received from JavaScript: " + payload);
// Process the payload and optionally respond
// (Response would typically be via executeScript)
});
// In browser JavaScript, this will trigger the listener:
// sendToJava("Hello from JavaScript!");Injects JavaScript code to be evaluated on every new document load.
/**
* Add script to be evaluated on every new document
* @param script JavaScript code to inject
* @return Command that returns ScriptIdentifier for later removal
*/
@Override
protected Command<ScriptIdentifier> addScriptToEvaluateOnNewDocument(String script);
/**
* Remove previously injected script
* @param id ScriptIdentifier returned from addScriptToEvaluateOnNewDocument
* @return Command to remove the script
*/
@Override
protected Command<Void> removeScriptToEvaluateOnNewDocument(ScriptIdentifier id);Usage Example:
// Inject script that runs on every page load
String initScript = """
window.myApp = {
initialized: true,
version: '1.0.0',
log: function(msg) {
console.log('[MyApp] ' + msg);
}
};
""";
ScriptIdentifier scriptId = devTools.send(
js.addScriptToEvaluateOnNewDocument(initScript));
// Navigate to pages - script will run automatically
driver.get("https://example.com");
driver.get("https://another-site.com");
// Remove the script when no longer needed
devTools.send(js.removeScriptToEvaluateOnNewDocument(scriptId));Provides access to binding call events from JavaScript to Java.
/**
* Stream of binding call events from JavaScript
* @return Event stream for binding calls
*/
@Override
protected Event<BindingCalled> bindingCalledEvent();
/**
* Extract payload from binding call event
* @param event BindingCalled event from JavaScript
* @return String payload sent from JavaScript
*/
@Override
protected String extractPayload(BindingCalled event);import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.v138.v138Javascript;
import org.openqa.selenium.devtools.v138.page.model.ScriptIdentifier;
ChromeDriver driver = new ChromeDriver();
DevTools devTools = driver.getDevTools();
devTools.createSession();
v138Javascript js = new v138Javascript(devTools);
// Enable required domains
devTools.send(js.enableRuntime());
devTools.send(js.enablePage());
// Set up bidirectional communication
devTools.send(js.doAddJsBinding("reportToJava"));
// Listen for messages from JavaScript
devTools.addListener(js.bindingCalledEvent(), event -> {
String message = js.extractPayload(event);
System.out.println("JavaScript says: " + message);
// Send response back via script execution
driver.executeScript("window.javaResponse = arguments[0];",
"Received: " + message);
});
// Inject initialization script
String initScript = """
window.communicator = {
sendToJava: function(message) {
reportToJava(JSON.stringify({
type: 'message',
content: message,
timestamp: Date.now()
}));
},
initialize: function() {
console.log('Communicator initialized');
this.sendToJava('System ready');
}
};
// Auto-initialize when DOM is ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded',
() => window.communicator.initialize());
} else {
window.communicator.initialize();
}
""";
ScriptIdentifier scriptId = devTools.send(
js.addScriptToEvaluateOnNewDocument(initScript));
// Navigate - initialization script will run
driver.get("https://example.com");
// Interact with the page
driver.executeScript("window.communicator.sendToJava('Page loaded successfully');");
// Clean up
devTools.send(js.removeScriptToEvaluateOnNewDocument(scriptId));
devTools.send(js.doRemoveJsBinding("reportToJava"));
devTools.send(js.disablePage());
devTools.send(js.disableRuntime());
devTools.close();
driver.quit();// Script identification for management
class ScriptIdentifier {
String toString(); // Unique identifier for injected scripts
}
// Binding event data
class BindingCalled {
String getName(); // Name of the binding that was called
String getPayload(); // Data sent from JavaScript
int getExecutionContextId(); // Context where binding was called
}Install with Tessl CLI
npx tessl i tessl/maven-org-seleniumhq-selenium--selenium-devtools-v138