[英]Capture console error using JavascriptExecutor class in selenium
我正在嘗試使用Selenium中的JavascriptExecutor類捕獲瀏覽器控制台錯誤。 我正在嘗試在Java代碼中使用js函數,如下所示。 從窗口對象調用此錯誤方法以獲取控制台錯誤的正確方法是什么?
程式碼片段如下:
driver = new ChromeDriver();
(JavascriptExecutor)driver).executeScript("window.console.error");
如果只想獲取console.error
,可以通過webdriver來獲取。 請參見下面的代碼。
爪哇
LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER);
for (LogEntry entry : logEntries) {
System.out.println(new Date(entry.getTimestamp()) + " " + entry.getLevel() + " " + entry.getMessage());
}
Java腳本
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);
但是,如果要同時捕獲console.error
和console.log
,則可以覆蓋它們,然后將消息推送到數組中。 導航到頁面后,必須立即注入代碼以覆蓋它們。 為此,您必須設置PageLoadStrategy = none
。 請參閱下面的代碼。
爪哇
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);
Java腳本
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();
請注意,當PageLoadStrategy
為none時,Selenium不會等到頁面加載完畢,因此您必須添加等待或睡眠狀態。
**更新**實際上,當您啟動chromedriver並從webdriver.manager()。logs()獲取它時,您只需設置日志級別即可。 請參閱下面的示例。
Java腳本
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);
我正在使用chrome瀏覽器,下面是代碼:
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();
使用上面的代碼總是提供SEVERE日志,您也可以使用其他選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.