3

JavaScriptを使用して1つのHTMLページを実行し、Javaでその出力にアクセスしたいと思います。JavaコードでブラウザのJavaScriptコンソール出力にアクセスする方法はありますか?

まず、Java(htmlunit)を使用してJavaScriptを実行しようとしましたが、JSのjQueryが原因でエラーが発生しました。

実行する必要のあるJS関数は、関連付けられたHTML要素を使用するため、ページを保存し、JSをそのページに追加して、ローカルで実行することを選択しました。その後、JavaScriptコンソールで出力を確認できます。次に、さらに処理するために、その出力をJavaコードで取得したいと思います。

4

5 に答える 5

2

迅速な対応に感謝します。Greasemonkey と firefox を使用して問題を解決しました。コンソールの代わりに、1 つのサーブレットを使用して出力をファイルに書き込みます。Greasemokey 内にインストールされた js メソッドは js メソッドを実行し、そこからの出力は 1 つのサーブレット (ローカルで実行中) の get リクエストを介して渡され、入力がファイルに書き込まれ、そのファイルを Java で使用できます。 Greasemonkey によって開かれました:D

于 2012-09-11T19:54:35.423 に答える
1

Seleniumでページにアクセスしてみてください。実際のブラウザー インスタンスを開いてクリックし (jquery の問題を解決)、 fetch もできるはずconsole.logです。

おそらく、この JS 単体テスト ツールのリストも役立つかもしれません: TDD 用の JavaScript 単体テスト ツール

于 2012-09-08T21:06:09.393 に答える
1

私は Prasanth の提案が気に入り、私にとってはうまくいきました。これが私のコードです。

RCP:

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);
于 2015-10-19T21:52:19.733 に答える
1

もちろん。ゆっくり読む:

私が得た素晴らしい考えの1つは、Javaを実行しているので、特定のポートでリッスンするサーバーにしないのはなぜですか? それは簡単にできます。

ポートでリッスンする単純なスレッドを取得したら、実行しているJavaScriptコードが何であれ、最後にいくつかの変数をコンソールに記録したい場合は、送信したいすべてのデータを使用してこのローカルサーバーにajax呼び出しを送信しますジャバに。

サーバーでリクエストを取得したら、データを他のスレッドに渡して譲ります。

複雑に見えても、私にはかなり実現可能な解決策のように思えます。

于 2012-09-08T21:13:13.517 に答える