javascript - 使用selenium中的JavascriptExecutor类捕获控制台错误

标签 javascript google-chrome selenium selenium-webdriver console.log

我正在尝试使用 selenium 中的 JavascriptExecutor 类捕获浏览器控制台错误。我正在尝试使用java代码中的js函数,如下所示。从窗口对象调用此错误方法以获得控制台错误的正确方法是什么?

代码片段如下:

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

最佳答案

如果你只想获取console.error,你可以通过webdriver获取它。请参阅下面的代码。

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);

但是如果您想同时捕获 console.errorconsole.log,您可以覆盖它们,然后将消息推送到数组中。 您必须在导航到页面后立即注入(inject)代码来覆盖它们。为此,您必须设置 PageLoadStrategy = none。 请参阅下面我的代码。

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();

请注意,当PageLoadStrategy为none时,Selenium不会等到页面加载,因此您必须添加wait或sleep。

** 更新 ** 实际上,您可以在启动 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);

关于javascript - 使用selenium中的JavascriptExecutor类捕获控制台错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51176912/

相关文章:

javascript - Internet Explorer 的回退 AJAX 文件上传

javascript - 动态传递父对象作为 JavaScript 中的参数

python - 'Connection aborted .', ConnectionResetError(104, ' Connection reset by peer')通过 Python 将 Selenium 与 ChromeDriver 和 Chrome 结合使用

javascript - 3D 数组 JavaScript

javascript - 使用 .trigger 将事件传递给子级

html - 使用 Chrome 开发者工具查看视口(viewport)之外

windows - Git 卡住帮助命令

javascript - 日语字符在 Google Chrome 中显示为其他符号

javascript - 即使 javascript 在控制台中返回值,getEval 在 Selenium 上返回 null

linux - Jenkins 、xvfb 和 Selenium