Avinash Jadhav
Avinash Jadhav

Reputation: 1393

Capture console error using JavascriptExecutor class in selenium

I am trying to capture browser console error using JavascriptExecutor class in selenium. I am trying it using js function in java code as below. What is the correct way to call this error method from window object inorder to get the console error ?

Code snippet is as below :

            driver = new ChromeDriver();                     
           (JavascriptExecutor)driver).executeScript("window.console.error");

Upvotes: 1

Views: 5163

Answers (2)

Buaban
Buaban

Reputation: 5137

If you want to get only console.error, you can get it via webdriver. See code below.

Java

LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER);
for (LogEntry entry : logEntries) {
    System.out.println(new Date(entry.getTimestamp()) + " " + entry.getLevel() + " " + entry.getMessage());
}

Javascript

await driver.get("http://www.buaban.com/files/test-console.html");
var res = await driver.manage().logs().get(webdriver.logging.Type.BROWSER);
console.log(res);

But if you want to capture both console.error and console.log, you may override them, and then push the message in an array. You have to inject code to override them immediately after navigate to the page. In order to do this, you have to set PageLoadStrategy = none. See my code below.

Java

ChromeOptions opt = new ChromeOptions();
opt.setPageLoadStrategy(PageLoadStrategy.NONE);
driver = new ChromeDriver(opt);

driver.get("http://www.buaban.com/files/test-console.html");
String script = 
    "(function() {" + 
        "var oldLog = console.error;" +
        "window.myError = [];" +
        "console.error = function (message) {" + 
            "window.myError.push(message);" + 
            "oldLog.apply(console, arguments);" +
        "};" +
    "})();" ;
((JavascriptExecutor)driver).executeScript(script);
((JavascriptExecutor)driver).executeScript("console.error('Test Error')");
Thread.sleep(3000);
String err = (String)((JavascriptExecutor)driver).executeScript("return JSON.stringify(window.myError);");
System.out.println(err);

Javascript

var webdriver = require('selenium-webdriver');
var chrome = require('selenium-webdriver/chrome');

async function run() {
    var opt = new chrome.Options();
    var driver = await new webdriver.Builder()
        .withCapabilities({'pageLoadStrategy':'none'})
        .forBrowser('chrome')
        .build();

    await driver.get("http://www.buaban.com/files/test-console.html");
    var script = ()=>{ 
        var oldError = console.error;
        var oldLog = console.log;
        window.myError = [];
        console.error = function (message) {
            window.myError.push(message);
            oldError.apply(console, arguments);
        };
        console.log = function (message) {
            window.myError.push(message);
            oldLog.apply(console, arguments);
        };
        return '';
    };
    await driver.executeScript(script);
    await driver.executeScript(()=>{
        console.log('Test Error');
        return '';
    });
    await Time.sleep(3000);
    var res = await driver.executeScript(()=>{
        return JSON.stringify(window.myError);
    });

    console.log(res);
    await driver.quit();
}

run();

Please note that, when the PageLoadStrategy is none, Selenium won't wait until the page loaded, so you have to add wait or sleep.

** UPDATE ** Actually, you can just set log level when you start chromedriver and then get it from webdriver.manager().logs(). See an example below.

Javascript

var opt = new chrome.Options();
var prefs = new webdriver.logging.Preferences();
prefs.setLevel(webdriver.logging.Type.BROWSER, webdriver.logging.Level.ALL);
opt.setLoggingPrefs(prefs);

var driver = await new webdriver.Builder()
    .forBrowser('chrome')
    .setChromeOptions(opt)
    .build();

await driver.get("http://www.buaban.com/files/test-console.html");

var res = await driver.manage().logs().get(webdriver.logging.Type.BROWSER);
console.log(res);

Upvotes: 9

Ankit Gupta
Ankit Gupta

Reputation: 786

I am using chrome browser below is the code:

    public PrintStream printlog = new PrintStream("your text file name with location");

    LogEntries logs = driver.manage().logs().get("browser");
    for (LogEntry entry : logs) {
        entry.getLevel() + " " + entry.getMessage());
        if (entry.getLevel() == entry.getLevel().SEVERE)
        printlog.append(new Date(entry.getTimestamp()) + " " + entry.getLevel() + " " + entry.getMessage()+" "+ System.getProperty("line.separator"));
    }
            printlog.append(System.getProperty("line.separator"));
            printlog.append(System.getProperty("line.separator"));
printlog.close();

Using above code always provide SEVERE logs, you can use other options as well.

Upvotes: -1

Related Questions