Chrome DevTools Protocol version 129 bindings for Selenium WebDriver.
—
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.
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();
}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();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');");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);
}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;
}
}// 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;// 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
}// 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 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();
}
}// 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 eventInstall with Tessl CLI
npx tessl i tessl/maven-org-seleniumhq-selenium--selenium-devtools-v129