Как получить вывод консоли java script браузера в java?

Я хочу запустить одну HTML-страницу с JavaScript и получить доступ к ее выводу на Java. Есть ли способ получить доступ к выводу консоли JavaScript браузера в коде Java?

Сначала я попытался выполнить JavaScript с помощью Java (htmlunit), но он выдал ошибку из-за jQuery в JS.

Функция JS, которую мне нужно выполнить, использует связанные элементы HTML, и поэтому я предпочел сохранить страницу, добавить свой JS на эту страницу и запустить ее локально. Затем я могу увидеть вывод на консоли JavaScript, и теперь я хочу получить этот вывод в коде Java для дальнейшей обработки.


person Pradeep    schedule 08.09.2012    source источник
comment
Является ли Java выполнением Javascript? Или вы хотите связать файл js, и java регистрирует все выходные данные console.log? Надо будет поконкретнее...   -  person jeremy    schedule 09.09.2012
comment
Никто не запускает HTML-страницу. Возможно, вы захотите изучить V8 или другой механизм Javascript, если хотите получить доступ к его выходным данным.   -  person Waleed Khan    schedule 09.09.2012
comment
но проблема в том, что я не могу запустить javascript в одиночку, так как он использует некоторые динамические html-элементы с веб-страницы, могу ли я выполнить их (js + html) с помощью этих движков?   -  person Pradeep    schedule 09.09.2012
comment
Вы пытаетесь написать тесты для своего кода JavaScript? Возможно, вы захотите взглянуть на фреймворк для тестирования веб-браузера, такой как Selenium или Watir.   -  person Daniel Pryden    schedule 09.09.2012
comment
Нет, я не запускаю тесты, я просто хочу получить вывод из java-скрипта, вызвав метод java-скрипта.   -  person Pradeep    schedule 09.09.2012


Ответы (5)


Спасибо всем за быстрые ответы, мы решили проблему с помощью Greasemonkey и firefox. Вместо консоли мы пишем вывод в файл с помощью одного сервлета. Установленный js внутри Greasemokey выполняет метод js, и выходные данные из него передаются через один запрос на получение сервлета (локально работающий), и он записывает ввод в файл, и мы можем использовать этот файл в java, код записи внутри файла просто добавил синхронизированный блок в случае нескольких ссылок открыл Greasemonkey :D

person Pradeep    schedule 11.09.2012

Попробуйте Selenium для доступа к странице. Он открывает реальный экземпляр браузера и щелкает (решает проблемы с jquery), а также должен иметь возможность извлекать console.log.

Возможно, этот список инструментов модульного тестирования JS также может вам помочь: инструменты тестирования для TDD

person Peter Ilfrich    schedule 08.09.2012
comment
Хорошо, я попробую Selinum Java Client Driver - person Pradeep; 09.09.2012

Конечно. Читайте медленно:

У меня возникла одна блестящая мысль: если вы используете Java, почему бы не сделать его сервером, который будет прослушивать определенный порт? Вы можете легко сделать это.

После того, как у вас есть простой поток, прослушивающий порт, в каком бы коде javascript вы ни выполнялись, в конце, когда вы хотите записать некоторые переменные на консоль, отправьте вызов ajax на этот локальный сервер со всеми данными, которые вы хотите отправить к яве.

Как только вы получите запрос на сервер, передайте данные другому потоку и выдайте результат.

Даже если это выглядит сложным, мне кажется вполне возможным решением.

person Prasanth    schedule 08.09.2012

Мне понравилось предложение Прасанта, и оно хорошо сработало для меня. Вот мой код.

РКП:

logger = ...
private void startJSConsole() {
        jsConsoleJob = new Job("JS Console Server") {

            @Override
            protected IStatus run(IProgressMonitor monitor) {
                Socket connectionSocket = null;
                try {
                    jsSocket = new ServerSocket(6789);
                    while (!monitor.isCanceled()) {
                        connectionSocket = jsSocket.accept();
                        readSocketData(connectionSocket);
                    }
                } catch (IOException e) {
                    if (!"Socket closed".equals(e.getMessage())) {
                        logger.logError("Unable to open or read from Javascript console server socket", e);
                    }
                    return Status.CANCEL_STATUS;
                } finally {
                    try {
                        if (jsSocket != null) {
                            jsSocket.close();
                        }
                        if (connectionSocket != null) {
                            connectionSocket.close();
                        }
                    } catch (IOException e) {
                        //pass
                    }
                }
                return Status.OK_STATUS;
            }
        };
        jsConsoleJob.setUser(false);
        jsConsoleJob.setSystem(true);
        jsConsoleJob.schedule();
    }

    //I copied this code from here: http://stackoverflow.com/a/21729100/2036650
    private void readSocketData(Socket connectionSocket) {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            // read request
            String line;
            line = in.readLine();
            StringBuilder raw = new StringBuilder();
            raw.append("" + line);
            boolean isPost = line.startsWith("POST");
            int contentLength = 0;
            while (!(line = in.readLine()).equals("")) {
                raw.append('\n' + line);
                if (isPost) {
                    final String contentHeader = "Content-Length: ";
                    if (line.startsWith(contentHeader)) {
                        contentLength = Integer.parseInt(line.substring(contentHeader.length()));
                    }
                }
            }
            StringBuilder body = new StringBuilder();
            if (isPost) {
                int c = 0;
                for (int i = 0; i < contentLength; i++) {
                    c = in.read();
                    body.append((char) c);
                }
            }
            raw.append(body.toString());
            System.err.println("JS: " + body.toString());
            connectionSocket.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Javascript:

<html>
      <head>
    ...
    <script>
        var global = global || {};
        global.consoleLog = function(msg) {
            var xhttp = new XMLHttpRequest();
            xhttp.open("POST", "http://localhost:6789", true);
            xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
            xhttp.send(msg);
        }
    </script>
    <script src="js/sigplot-minimized.js"></script>
</head>
<body>
...
</body>
</html>

Затем из любого места кода Javascript:

global.consoleLog(logMessage);
person MidnightJava    schedule 19.10.2015

Чтобы завершить ответ @MinuitJava, вы также можете добавить прослушиватель событий ошибок.

window.addEventListener('error', function (e) {
  console.log(e.type +  " : " + e.message + "\n");
  console.log(e);

  // var xhttp = new XMLHttpRequest();
  // code . . .
});

Документ MDN: Окно: событие ошибки

person jTorleon    schedule 12.02.2021
comment
Решение с браузером Java и SWT см.:‹stackoverflow.com/a/66180802/15173048 - person jTorleon; 13.02.2021