Reputation: 1393
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
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
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