javascript - 在 selenium 中使用 JavascriptExecutor 类捕获控制台错误
问题描述
我正在尝试使用 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());
}
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);
但是如果你想同时捕获console.error
and 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);
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();
请注意,如果PageLoadStrategy
为 none,Selenium 不会等到页面加载完毕,因此您必须添加等待或睡眠。
** 更新 ** 实际上,您可以在启动 chromedriver 时设置日志级别,然后从 webdriver.manager().logs() 获取它。请参阅下面的示例。
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);
推荐阅读
- excel - 运行时错误“380”无法设置 RowSource 属性,属性值无效
- javascript - 如何将数组的一项与数组的另一项连接起来
- javascript - 如何从 Android Java 毫不延迟地调用 WebView Javascript 中的函数?
- typescript - 打字稿编译器忽略现有的命名空间
- scala - 在 spark 1.6 中将 spark 的输出保存到 csv
- python - 如何用向量的元素划分 keras 3D 张量的切片?
- semantic-ui - Semantic-ui 表单验证基本设置
- lua - lua 中的“object = {...}”有什么用?
- ios - 用于开发 iOS/iPadOS 的编程语言是什么?
- list - 在简单的 OR 条件内比较计算列公式中的数字,然后 IF 条件在 SharePoint 中未返回正确值