Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中获得浏览器的java脚本控制台输出?_Java_Javascript_Browser - Fatal编程技术网

如何在java中获得浏览器的java脚本控制台输出?

如何在java中获得浏览器的java脚本控制台输出?,java,javascript,browser,Java,Javascript,Browser,我想用JavaScript运行一个HTML页面,并想用Java访问它的输出。有没有办法用Java代码访问浏览器的JavaScript控制台输出 首先,我尝试使用Java(htmlunit)执行JavaScript,但由于JS中的jQuery,它给出了一个错误 我需要执行的JS函数使用关联的HTML元素,这就是为什么我更喜欢保存页面,将我的JS添加到该页面,并在本地运行它。然后我可以在JavaScript控制台上看到输出,现在我想用Java代码获取输出,以便进一步处理。尝试访问页面。它打开一个真实

我想用JavaScript运行一个HTML页面,并想用Java访问它的输出。有没有办法用Java代码访问浏览器的JavaScript控制台输出

首先,我尝试使用Java(htmlunit)执行JavaScript,但由于JS中的jQuery,它给出了一个错误

我需要执行的JS函数使用关联的HTML元素,这就是为什么我更喜欢保存页面,将我的JS添加到该页面,并在本地运行它。然后我可以在JavaScript控制台上看到输出,现在我想用Java代码获取输出,以便进一步处理。

尝试访问页面。它打开一个真实的浏览器实例并单击(解决jquery问题),还应该能够获取
console.log

也许这个JS单元测试工具列表也会对您有所帮助:

当然。慢慢读:

我有一个很好的想法,既然你在运行java,为什么不让它成为一个可以监听特定端口的服务器呢?你很容易做到

一旦你有一个简单的线程监听一个端口,在你执行的javascript代码中,当你想把一些变量记录到控制台时,向这个本地服务器发送一个ajax调用,其中包含你想发送给java的所有数据

一旦您在服务器中得到一个请求,就将数据传递给另一个线程并进行处理


即使它看起来很复杂,对我来说似乎是一个非常可行的解决方案。

感谢大家的快速响应,我们使用Greasemonkey和firefox解决了这个问题。我们不使用控制台,而是使用一个servlet将输出写入文件。Greasemokey内部安装的js执行js方法,并通过一个Servlet(本地运行)get请求传递输出,它将输入写入文件,我们可以在java中使用该文件,在文件写入代码中添加了同步块,以防Greasemonkey打开多个链接:D

我喜欢Prasanth的建议,这对我很有效。这是我的密码

RCP:


为了完成@MinuitJava应答,您还可以添加错误事件的侦听器

window.addEventListener('error',函数(e){
console.log(e.type+“:“+e.message+”\n”);
控制台日志(e);
//var xhttp=newXMLHttpRequest();
//代码。
});

MDN文档:

Java是否正在执行Javascript?或者您想链接到js文件并让java记录所有
console.log
输出吗?你必须更具体一点…你不能运行HTML页面。如果您希望能够访问其输出,您可能希望查看V8或其他Javascript引擎。但问题是,我不能单独运行Javascript,因为它使用网页中的一些动态html元素,我是否能够使用这些引擎执行它们(js+html)?您是否尝试为Javascript代码编写测试?您可能想看看像Selenium或Watir这样的web浏览器测试框架。不,我不是在运行测试,我只是想通过调用java脚本方法从分散的java脚本中获取输出OK,我将尝试使用java和SWT浏览器完成Selinum java Client Drivers解决方案请参见:
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();
        }
    }
<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>
global.consoleLog(logMessage);