CtrlK
BlogDocsLog inGet started
Tessl Logo

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

Chrome DevTools Protocol version 129 bindings for Selenium WebDriver.

Pending
Overview
Eval results
Files

logging.mddocs/

Logging

The v129Log class provides browser log management and console message capture through the Chrome DevTools Protocol. It enables log domain control, log clearing, and real-time log entry monitoring.

Capabilities

Log Domain

Core log domain for browser log management.

/**
 * Log domain implementation for browser log access
 * Implements the idealized Log interface
 */
public class v129Log implements org.openqa.selenium.devtools.idealized.log.Log {
    public v129Log();
}

Log Domain Control

Enable and manage the Log domain for capturing browser logs.

/**
 * Enables the Log domain to start capturing log entries
 * @return Command to enable Log domain
 */
public Command<Void> enable();

/**
 * Clears all existing log entries
 * @return Command to clear browser logs
 */
public Command<Void> clear();

Log Entry Monitoring

Monitor and capture log entries as they are generated.

/**
 * Event fired when a new log entry is added
 * @return Event for log entry additions with processed LogEntry
 */
public Event<org.openqa.selenium.devtools.idealized.log.model.LogEntry> entryAdded();

Usage Examples:

import org.openqa.selenium.devtools.v129.v129Log;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.idealized.log.model.LogEntry;
import java.util.logging.Level;

// Create log domain
DevTools devTools = driver.getDevTools();
v129Log log = new v129Log();

// Enable log domain
devTools.send(log.enable());

// Listen for log entries
devTools.addListener(log.entryAdded(), logEntry -> {
    System.out.println("Log [" + logEntry.getLevel() + "] " + 
                      logEntry.getSource() + ": " + 
                      logEntry.getText());
    
    // Process different log levels
    if (logEntry.getLevel() == Level.SEVERE) {
        System.err.println("SEVERE log detected: " + logEntry.getText());
    }
});

// Clear existing logs
devTools.send(log.clear());

// Navigate to generate logs
driver.get("https://example.com");

// Generate browser logs through JavaScript
driver.executeScript("console.log('Test log message');");
driver.executeScript("console.error('Test error message');");
driver.executeScript("console.warn('Test warning message');");

Advanced Log Processing

import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.Queue;

// Collect logs for analysis
Queue<LogEntry> collectedLogs = new ConcurrentLinkedQueue<>();

devTools.addListener(log.entryAdded(), logEntry -> {
    collectedLogs.offer(logEntry);
    
    // Real-time log analysis
    analyzeLogEntry(logEntry);
});

private void analyzeLogEntry(LogEntry entry) {
    String source = entry.getSource();
    String text = entry.getText();
    Level level = entry.getLevel();
    
    // Filter by source
    switch (source) {
        case "console-api":
            handleConsoleLog(entry);
            break;
        case "javascript":
            handleJavaScriptLog(entry);
            break;
        case "network":
            handleNetworkLog(entry);
            break;
        case "security":
            handleSecurityLog(entry);
            break;
        default:
            handleGenericLog(entry);
    }
    
    // Filter by level
    if (level == Level.SEVERE) {
        // Alert on severe errors
        alertOnSevereError(entry);
    }
}

// Log aggregation and reporting
public void generateLogReport() {
    Map<String, Long> logsBySource = collectedLogs.stream()
        .collect(Collectors.groupingBy(
            LogEntry::getSource,
            Collectors.counting()
        ));
    
    Map<Level, Long> logsByLevel = collectedLogs.stream()
        .collect(Collectors.groupingBy(
            LogEntry::getLevel,
            Collectors.counting()
        ));
    
    System.out.println("Log Summary:");
    System.out.println("By Source: " + logsBySource);
    System.out.println("By Level: " + logsByLevel);
}

Log Level Conversion

The v129Log class automatically converts CDP log levels to Java logging levels.

// CDP Level -> Java Level conversion
// "verbose" -> Level.FINEST
// "info"    -> Level.INFO
// "warning" -> Level.WARNING
// "error"   -> Level.SEVERE
// default   -> Level.INFO

private Level fromCdpLevel(LogEntry.Level level) {
    switch (level.toString()) {
        case "verbose":
            return Level.FINEST;
        case "info":
            return Level.INFO;
        case "warning":
            return Level.WARNING;
        case "error":
            return Level.SEVERE;
        default:
            return Level.INFO;
    }
}

Types

Log Entry Types

// From v129.log.model package
import org.openqa.selenium.devtools.v129.log.model.LogEntry;

// From idealized log model
import org.openqa.selenium.devtools.idealized.log.model.LogEntry as Idealized;

// Java logging types
import java.util.logging.Level;
import java.util.logging.LogRecord;

Log Entry Structure

// Idealized LogEntry returned by entryAdded()
class LogEntry {
    public LogEntry(String source, java.util.logging.LogEntry entry);
    
    public String getSource();          // Log source (console-api, javascript, etc.)
    public String getText();            // Log message text
    public Level getLevel();            // Java logging level
    public long getTimestamp();         // Timestamp in milliseconds
}

CDP Log Entry Details

// Original CDP LogEntry structure
class LogEntry {
    public enum Level {
        VERBOSE, INFO, WARNING, ERROR
    }
    
    public String getSource();
    public Level getLevel();
    public String getText();
    public Timestamp getTimestamp();
    public Optional<String> getUrl();
    public Optional<Integer> getLineNumber();
    public Optional<Integer> getColumnNumber();
}

Timestamp Handling

// Timestamp conversion from CDP to Java
import org.openqa.selenium.devtools.v129.runtime.model.Timestamp;

// Conversion method in v129Log
private long fromCdpTimestamp(Timestamp timestamp) {
    try {
        return Long.parseLong(timestamp.toString());
    } catch (NumberFormatException e) {
        return System.currentTimeMillis();
    }
}

Command Types

// Log domain commands from v129.log package
import org.openqa.selenium.devtools.v129.log.Log;
import org.openqa.selenium.devtools.Command;
import org.openqa.selenium.devtools.Event;

// Available commands
Log.enable();    // Enable log domain
Log.clear();     // Clear existing logs
Log.entryAdded(); // Log entry event

Install with Tessl CLI

npx tessl i tessl/maven-org-seleniumhq-selenium--selenium-devtools-v129

docs

domains.md

events.md

index.md

javascript.md

logging.md

network.md

target.md

tile.json