วิธีรับ ouput คอนโซลสคริปต์ java ของเบราว์เซอร์ใน 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
แต่ปัญหาคือ ฉันไม่สามารถรันจาวาสคริปต์เพียงอย่างเดียวได้ เนื่องจากมันใช้องค์ประกอบ html ไดนามิกบางส่วนจากหน้าเว็บ ฉันสามารถรันพวกมัน (js+html) โดยใช้เอ็นจิ้นเหล่านี้ได้หรือไม่   -  person Pradeep    schedule 09.09.2012
comment
คุณกำลังพยายามเขียนการทดสอบโค้ด JavaScript ของคุณหรือไม่? คุณอาจต้องการดูกรอบการทดสอบเว็บเบราว์เซอร์เช่น Selenium หรือ Watir   -  person Daniel Pryden    schedule 09.09.2012
comment
ไม่ ฉันไม่ได้ทำการทดสอบ ฉันแค่ต้องการรับเอาต์พุตจากสคริปต์ java ที่ถูกใช้งานโดยการเรียกวิธี java script   -  person Pradeep    schedule 09.09.2012


คำตอบ (5)


ขอขอบคุณทุกท่านสำหรับการตอบกลับอย่างรวดเร็ว เราได้แก้ไขปัญหาโดยใช้ Greasemonkey และ firefox แล้ว แทนที่จะเขียนคอนโซล เรากำลังเขียนเอาต์พุตไปยังไฟล์โดยใช้เซิร์ฟเล็ตเดียว js ที่ติดตั้งไว้ภายใน Greasemokey ดำเนินการวิธี js และเอาต์พุตจากนั้นถูกส่งผ่านหนึ่งคำขอ Servlet (ทำงานภายในเครื่อง) และเขียนอินพุตไปยังไฟล์และเราสามารถใช้ไฟล์นั้นใน java โค้ดเขียนไฟล์ภายในเพิ่งเพิ่มบล็อกซิงโครไนซ์ในกรณีที่มีหลายลิงก์ เปิดโดย Greasemonkey :D

person Pradeep    schedule 11.09.2012

ลองใช้ Selenium เพื่อเข้าถึง เพจ โดยจะเปิดอินสแตนซ์เบราว์เซอร์จริงและคลิก (แก้ไขปัญหา jquery) และควรจะดึงข้อมูล console.log ได้ด้วย

บางทีรายการเครื่องมือทดสอบหน่วย JS นี้อาจช่วยคุณได้เช่นกัน: หน่วย JavaScript เครื่องมือทดสอบสำหรับ TDD

person Peter Ilfrich    schedule 08.09.2012
comment
ตกลง ฉันจะลองใช้ Selinum Java Client Driver - person Pradeep; 09.09.2012

@Henk ใช่แล้ว ขออภัยไม่คิดว่าเขาใช้ คลาสเคล็ดลับเครื่องมือ
person Prasanth    schedule 08.09.2012

ฉันชอบคำแนะนำของ Prasanth และมันได้ผลดีสำหรับฉัน นี่คือรหัสของฉัน

อาร์ซีพี:

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>

จากนั้นจากที่ใดก็ได้ในโค้ด 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