Chrome DevTools Protocol (CDP) bindings for Selenium WebDriver version 138
—
Console log management and event streaming for Chrome DevTools Protocol v138. Provides access to browser console output with level filtering, timestamp conversion, and comprehensive log event handling.
Main console logging handler providing access to browser console output.
/**
* Console logging functionality for CDP v138
* Default constructor - stateless implementation
*/
public class v138Log implements org.openqa.selenium.devtools.idealized.log.Log {
// No explicit constructor - uses default constructor
}Usage Example:
import org.openqa.selenium.devtools.v138.v138Log;
import org.openqa.selenium.devtools.DevTools;
v138Log log = new v138Log();
// Enable console logging
devTools.send(log.enable());
// Listen for log entries
devTools.addListener(log.entryAdded(), logEntry -> {
System.out.printf("[%s] %s: %s%n",
logEntry.getSource(),
logEntry.getEntry().getLevel(),
logEntry.getEntry().getMessage());
});Enables and manages the Log domain for console output capture.
/**
* Enable Log domain to start capturing console output
* @return Command to enable log domain
*/
@Override
public Command<Void> enable();
/**
* Clear all console logs
* @return Command to clear console buffer
*/
@Override
public Command<Void> clear();Usage Example:
// Enable logging
devTools.send(log.enable());
// Navigate and generate some console output
driver.get("https://example.com");
driver.executeScript("console.log('Page loaded'); console.error('Test error');");
// Clear the console
devTools.send(log.clear());
// Generate more output - previous entries are cleared
driver.executeScript("console.warn('After clear');");Provides access to console log entries as they are generated.
/**
* Stream of console log entry events
* @return Event stream for log entries from browser console
*/
@Override
public Event<LogEntry> entryAdded();
/**
* Convert CDP log level to Java logging level
* @param level CDP log level
* @return Java logging Level
*/
private Level fromCdpLevel(LogEntry.Level level);
/**
* Convert CDP timestamp to milliseconds
* @param timestamp CDP timestamp
* @return Timestamp in milliseconds
*/
private long fromCdpTimestamp(Timestamp timestamp);Usage Example:
// Listen for different log levels
devTools.addListener(log.entryAdded(), logEntry -> {
org.openqa.selenium.logging.LogEntry entry = logEntry.getEntry();
switch (entry.getLevel().getName()) {
case "SEVERE":
System.err.println("ERROR: " + entry.getMessage());
break;
case "WARNING":
System.out.println("WARN: " + entry.getMessage());
break;
case "INFO":
System.out.println("INFO: " + entry.getMessage());
break;
case "FINE":
case "FINER":
case "FINEST":
System.out.println("DEBUG: " + entry.getMessage());
break;
default:
System.out.println("LOG: " + entry.getMessage());
}
});
// Enable logging to start receiving events
devTools.send(log.enable());The v138Log implementation maps Chrome DevTools Protocol log levels to Java logging levels:
Level.FINESTLevel.INFOLevel.WARNINGLevel.SEVERELevel.INFO (for unknown levels)import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.v138.v138Log;
import org.openqa.selenium.logging.LogEntry;
import java.util.logging.Level;
ChromeDriver driver = new ChromeDriver();
DevTools devTools = driver.getDevTools();
devTools.createSession();
v138Log log = new v138Log();
// Enable console logging
devTools.send(log.enable());
// Set up comprehensive log monitoring
devTools.addListener(log.entryAdded(), logEntry -> {
LogEntry entry = logEntry.getEntry();
Level level = entry.getLevel();
String source = logEntry.getSource();
long timestamp = entry.getTimestamp();
String message = entry.getMessage();
// Format log output with full details
System.out.printf("[%d] [%s] [%s] %s%n",
timestamp, source, level.getName(), message);
// Handle different log levels
if (level.intValue() >= Level.SEVERE.intValue()) {
// Log errors to separate error handling
handleError(message, timestamp);
} else if (level.intValue() >= Level.WARNING.intValue()) {
// Track warnings for analysis
trackWarning(message, timestamp);
}
});
// Navigate to page and execute JavaScript that generates logs
driver.get("https://example.com");
// Generate various console outputs
driver.executeScript("""
console.log('Application initialized');
console.info('User session started');
console.warn('Deprecated API usage detected');
console.error('Failed to load resource');
// Generate logs over time
setTimeout(() => console.log('Delayed log message'), 1000);
setTimeout(() => console.error('Async error'), 2000);
""");
// Wait for delayed logs
Thread.sleep(3000);
// Clear console for fresh start
devTools.send(log.clear());
System.out.println("Console cleared - new logs will appear below:");
// Generate post-clear logs
driver.executeScript("console.log('Post-clear message');");
// Clean up
devTools.close();
driver.quit();
// Helper methods for log processing
private static void handleError(String message, long timestamp) {
// Error handling logic
System.err.println("ERROR HANDLER: " + message + " at " + timestamp);
}
private static void trackWarning(String message, long timestamp) {
// Warning tracking logic
System.out.println("WARNING TRACKER: " + message + " at " + timestamp);
}// Log entry wrapper
class LogEntry {
String getSource(); // Source of the log entry ("javascript", "network", etc.)
org.openqa.selenium.logging.LogEntry getEntry(); // Selenium log entry
}
// Selenium log entry structure
class org.openqa.selenium.logging.LogEntry {
Level getLevel(); // Java logging level
long getTimestamp(); // Timestamp in milliseconds
String getMessage(); // Log message content
}
// CDP log levels (internal)
enum LogEntry.Level {
VERBOSE, // Detailed debug information
INFO, // General information
WARNING, // Warning conditions
ERROR // Error conditions
}
// CDP timestamp (internal)
class Timestamp {
String toString(); // String representation of timestamp
JsonElement toJson(); // JSON representation for parsing
}Install with Tessl CLI
npx tessl i tessl/maven-org-seleniumhq-selenium--selenium-devtools-v138