CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-org-seleniumhq-selenium--selenium-devtools-v138

Chrome DevTools Protocol (CDP) bindings for Selenium WebDriver version 138

Pending
Overview
Eval results
Files

javascript-integration.mddocs/

JavaScript Integration

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.

Capabilities

JavaScript Handler

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 };");

Public JavaScript API Methods

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();

Runtime Domain Control

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();

Page Domain Control

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();

JavaScript Binding Management

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!");

Script Injection

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));

Binding Event Stream

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);

Complete JavaScript Integration Example

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();

Types

// 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

docs

console-logging.md

domain-management.md

index.md

javascript-integration.md

network-operations.md

runtime-events.md

target-management.md

version-system.md

tile.json