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

runtime-events.mddocs/

Runtime Events

Runtime events handling and console monitoring capabilities for Chrome DevTools Protocol v138. Enables capturing JavaScript exceptions, console messages, and runtime diagnostics with full event conversion support.

Capabilities

Events Handler

Main events handler providing runtime event management and console API integration.

/**
 * Runtime events and console handling for CDP v138
 * @param devtools DevTools connection for event communication
 */
public class v138Events extends Events<ConsoleAPICalled, ExceptionThrown> {
    public v138Events(DevTools devtools);
    
    // Public API methods inherited from Events base class
    public void addConsoleListener(Consumer<ConsoleEvent> listener);
    public void addJavascriptExceptionListener(Consumer<JavascriptException> listener);
    public void disable();
}

Usage Example:

import org.openqa.selenium.devtools.v138.v138Events;
import org.openqa.selenium.devtools.DevTools;
import java.util.function.Consumer;

v138Events events = new v138Events(devTools);

// Use public API methods for event handling
events.addConsoleListener(console -> {
    System.out.println("Console " + console.getType() + ": " + 
        console.getArgs().get(0));
});

events.addJavascriptExceptionListener(exception -> {
    System.err.println("JavaScript Error: " + exception.getMessage());
});

Public Event Listener Methods

High-level methods for registering event listeners without dealing with raw CDP events.

/**
 * Add listener for console events (console.log, console.error, etc.)
 * @param listener Consumer that receives ConsoleEvent objects
 */
public void addConsoleListener(Consumer<ConsoleEvent> listener);

/**
 * Add listener for JavaScript exceptions
 * @param listener Consumer that receives JavascriptException objects
 */
public void addJavascriptExceptionListener(Consumer<JavascriptException> listener);

/**
 * Disable all event monitoring and clean up resources
 */
public void disable();

Usage Example:

v138Events events = new v138Events(devTools);

// Add console listener - automatically handles event conversion
events.addConsoleListener(console -> {
    System.out.printf("[%s] %s: %s%n",
        console.getTimestamp(),
        console.getType(),
        console.getArgs().get(0));
});

// Add exception listener
events.addJavascriptExceptionListener(exception -> {
    System.err.println("JS Exception: " + exception.getMessage());
    exception.printStackTrace();
});

// Navigate and generate events
driver.get("https://example.com");
driver.executeScript("console.log('Test message'); throw new Error('Test error');");

// Clean up when done
events.disable();

Runtime Domain Control

Enables and disables the Runtime domain for event reception.

/**
 * Enable Runtime domain to start receiving events
 * @return Command to enable runtime domain
 */
@Override
protected Command<Void> enableRuntime();

/**
 * Disable Runtime domain to stop receiving events
 * @return Command to disable runtime domain
 */
@Override
protected Command<Void> disableRuntime();

Console Event Stream

Provides access to console API events from the browser runtime.

/**
 * Stream of console API events (console.log, console.error, etc.)
 * @return Event stream for console API calls
 */
@Override
protected Event<ConsoleAPICalled> consoleEvent();

Usage Example:

// Listen for all console events
devTools.addListener(events.consoleEvent(), event -> {
    ConsoleEvent converted = events.toConsoleEvent(event);
    System.out.printf("[%s] %s: %s%n", 
        converted.getTimestamp(),
        converted.getType(),
        converted.getArgs().get(0));
});

// Now console.log calls in browser will trigger the listener
driver.executeScript("console.log('Hello from browser!');");

Exception Event Stream

Provides access to JavaScript exception events from the browser runtime.

/**
 * Stream of JavaScript exception events
 * @return Event stream for unhandled exceptions
 */
@Override
protected Event<ExceptionThrown> exceptionThrownEvent();

Usage Example:

// Listen for JavaScript exceptions
devTools.addListener(events.exceptionThrownEvent(), event -> {
    JavascriptException jsException = events.toJsException(event);
    System.err.println("JavaScript Error: " + jsException.getMessage());
    jsException.printStackTrace();
});

// Now unhandled JavaScript errors will trigger the listener
driver.executeScript("throw new Error('Test exception');");

Event Conversion

Converts raw CDP events to Selenium-compatible event objects.

/**
 * Convert CDP ConsoleAPICalled to Selenium ConsoleEvent
 * @param event Raw CDP console event
 * @return Selenium-compatible console event
 */
@Override
protected ConsoleEvent toConsoleEvent(ConsoleAPICalled event);

/**
 * Convert CDP ExceptionThrown to JavascriptException
 * @param event Raw CDP exception event
 * @return Java exception with stack trace
 */
@Override
protected JavascriptException toJsException(ExceptionThrown event);

Event Types

ConsoleEvent Structure

class ConsoleEvent {
    String getType();           // "log", "error", "warn", "info", etc.
    Instant getTimestamp();     // When the event occurred
    List<Object> getArgs();     // Console arguments as RemoteObjects
    List<Object> getRawArgs();  // Original CDP arguments
}

JavascriptException Structure

JavaScript exceptions are converted to standard Java exceptions with reconstructed stack traces:

class JavascriptException extends RuntimeException {
    String getMessage();        // Exception message or description
    StackTraceElement[] getStackTrace(); // Reconstructed JavaScript stack
}

Runtime Event Monitoring

Complete example of runtime event monitoring setup:

import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.v138.v138Events;

ChromeDriver driver = new ChromeDriver();
DevTools devTools = driver.getDevTools();
devTools.createSession();

v138Events events = new v138Events(devTools);

// Enable runtime events
devTools.send(events.enableRuntime());

// Monitor console output
devTools.addListener(events.consoleEvent(), event -> {
    ConsoleEvent console = events.toConsoleEvent(event);
    System.out.printf("[Console %s] %s%n", 
        console.getType(), 
        console.getArgs().get(0));
});

// Monitor JavaScript exceptions
devTools.addListener(events.exceptionThrownEvent(), event -> {
    JavascriptException jsError = events.toJsException(event);
    System.err.println("JavaScript Exception: " + jsError.getMessage());
});

// Navigate and execute JavaScript
driver.get("https://example.com");
driver.executeScript("console.log('Page loaded'); console.error('Test error');");

// Clean up
devTools.send(events.disableRuntime());
devTools.close();
driver.quit();

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