admin管理员组文章数量:1399116
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");
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");
Share
Improve this question
edited Jul 4, 2018 at 15:27
Avinash Jadhav
asked Jul 4, 2018 at 15:22
Avinash JadhavAvinash Jadhav
1,3933 gold badges12 silver badges21 bronze badges
4
- Possible duplicate of Capturing JavaScript error in Selenium – user5734311 Commented Jul 4, 2018 at 15:25
- @Chris G suggested link is not useful with JavascriptExecutor object – Avinash Jadhav Commented Jul 4, 2018 at 15:28
-
You can use
JavascriptExecutor
to run thewindow.onerror
assignment call. – user5734311 Commented Jul 4, 2018 at 15:57 - @Chris what parameter I need to pass if we consider above code snippet – Avinash Jadhav Commented Jul 4, 2018 at 16:00
2 Answers
Reset to default 9If 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./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./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./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./files/test-console.html");
var res = await driver.manage().logs().get(webdriver.logging.Type.BROWSER);
console.log(res);
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.
本文标签: javascriptCapture console error using JavascriptExecutor class in seleniumStack Overflow
版权声明:本文标题:javascript - Capture console error using JavascriptExecutor class in selenium - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744170054a2593738.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论