Ошибка захвата консоли с использованием класса JavascriptExecutor в селене - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь зафиксировать ошибку консоли браузера, используя класс JavascriptExecutor в селене. Я пытаюсь это с помощью функции JS в коде Java, как показано ниже. Как правильно вызвать этот метод ошибки из окна объекта окна, чтобы получить ошибку консоли?

Фрагмент кода, как показано ниже:

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

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Я использую браузер 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();

Используя приведенный выше код, вы всегда можете получить ЛЕВЫЕ журналы, вы также можете использовать другие опции.

0 голосов
/ 05 июля 2018

Если вы хотите получить только console.error, вы можете получить его через веб-драйвер. См. Код ниже.

Java

LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER);
for (LogEntry entry : logEntries) {
    System.out.println(new Date(entry.getTimestamp()) + " " + entry.getLevel() + " " + entry.getMessage());
}

1010 * 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, и console.log, вы можете переопределить их, а затем отправить сообщение в массив. Вы должны ввести код, чтобы переопределить их сразу после перехода на страницу. Для этого вам нужно установить 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 не равен, 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);
...