Сбой выполнения javascript в java с неопределенным XPathResult

Я пытаюсь выполнить функцию javascript с помощью java, и я получаю сообщение об ошибке, что он не может найти некоторые классы. может кто-нибудь, пожалуйста, помогите мне решить эту проблему?

Мой класс Java

public class TestException {

    public static void main(String[] args) throws IOException, ScriptException {
        ScriptEngineManager engineMgr=new ScriptEngineManager();
        ScriptEngine engine=engineMgr.getEngineByName("JavaScript");
        Document doc=HtmlPage.getHTML("", "C:\\Users\\DELL\\Desktop\\PHPTRAVELS.html", "https://phptravels.com");
        String xpath = "//input";
        
        //for single value
    /*  String jscript = "return document.evaluate('"+xpath+"',document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;";
        WebElement element=(WebElement)jse.executeScript(jscript);
        System.out.println(element.getAttribute("name"));*/
        
        String multiCode = "var test=function(document){"
                + "var results=document.evaluate('//input', document,null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);"+
                "var tagNames = [];\r\n"
                + "var count=0;" +
                "while(node = results.iterateNext()) {\r\n" + 
                "  count=count+1;" + 
                "}"
                + "\r\n return count}";
        /*FileWriter fileWrite=new FileWriter(new File(System.getProperty("user.dir")+"\\jScript.js"));
        fileWrite.write(multiCode);
        fileWrite.flush();
        fileWrite.close();*/
        
        try{
            engine.eval(multiCode);
            Invocable invc=(Invocable) engine;
            Long count=(Long)invc.invokeFunction("test", doc);
        //Long count=(Long) jse.executeScript(multiCode);
        System.out.println(count);
        }catch(Exception e){
            e.printStackTrace();
        }
        }

Исключение

javax.script.ScriptException: ReferenceError: "XPathResult" is not defined in <eval> at line number 1
    at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:470)
    at jdk.nashorn.api.scripting.NashornScriptEngine.invokeImpl(NashornScriptEngine.java:392)
    at jdk.nashorn.api.scripting.NashornScriptEngine.invokeFunction(NashornScriptEngine.java:190)
    at demo.TestException.main(TestException.java:58)
Caused by: <eval>:1 ReferenceError: "XPathResult" is not defined
    at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:57)
    at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:319)
    at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:291)
    at jdk.nashorn.internal.objects.Global.__noSuchProperty__(Global.java:1441)
    at jdk.nashorn.internal.scripts.Script$Recompilation$1$27A$\^eval\_.test(<eval>:1)
    at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:639)
    at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
    at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
    at jdk.nashorn.api.scripting.ScriptObjectMirror.callMember(ScriptObjectMirror.java:199)
    at jdk.nashorn.api.scripting.NashornScriptEngine.invokeImpl(NashornScriptEngine.java:386)

пожалуйста, дайте мне знать, если данные требуются с моей стороны.

Возможно, DOM не загружается при запуске скрипта или у вас могут отсутствовать результаты для XPath.

Ozgur Sar 19.12.2020 08:12

«Интерфейс XPathResult представляет результаты, сгенерированные путем оценки выражения XPath в контексте данного узла. Поскольку выражения XPath могут приводить к различным типам результатов, этот интерфейс позволяет определять и обрабатывать тип и значение результата».

Satish Rongala 19.12.2020 08:18

Я также выполнил отладку, но не обнаружил никаких проблем с кодом... и multicode String в коде, который я пытаюсь выполнить.

Satish Rongala 19.12.2020 08:20

Вы пробовали использовать другой xpath, кроме //input?

Ozgur Sar 19.12.2020 08:21

Да, я пытался, но получаю XapthResult не определено

Satish Rongala 19.12.2020 08:22

Возможно, загруженный документ не является допустимым файлом HTML или XML. У меня нет идей...

Ozgur Sar 19.12.2020 08:24
String testCode = "var demo=function(document){return document.getElementById('address');}"; я пробовал с этой функцией, и я могу получить результат..
Satish Rongala 19.12.2020 08:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
570
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема с вашим кодом в том, что вы используете XPathResult, который присутствует в объекте window, реализация объекта window обеспечивается веб-браузером. Nashorn (ScriptEngine) не обеспечивает window реализацию.

Из документов Java:

Хотя Oracle Nashorn использует JavaScript, совместимый с ECMA, важно отметить, что объекты, обычно доступные в веб-браузере, недоступны, например консоль, окно и т. д.

Вы можете выполнить и проверить свой js-код с помощью Nashorn, используя опцию jjs:

> jjs test.js
abc.js:2 ReferenceError: "XPathResult" is not defined

Поскольку вы хотите проанализировать файл HTML, вы можете сделать это с помощью анализатора HTML, такого как https://jsoup.org/, если вы используете этот код для тестирования, вы можете использовать API Selenium JavascriptExecutor#executeScript(...)

Да, я знаю о jsoup, что именно я пытаюсь сделать, так это то, что когда-либо xpath, который я передам, должен быть проверен документом и получить количество совпадающих результатов, для этого в jsoup нет доступного метода для проверки xpath .. поэтому я пытаюсь использовать этот

Satish Rongala 19.12.2020 09:40

@SatishRongala, если я не ошибаюсь, вы пытаетесь найти количество полей input, верно? Добавьте больше деталей к вопросу о том, что именно вы пытаетесь сделать.

Govinda Sakhare 19.12.2020 09:49

Да, я пытаюсь найти количество полей ввода на веб-странице с помощью xpath

Satish Rongala 19.12.2020 11:37

Вы можете искать и подсчитывать теги input, используя jsoup. Но если вы строго хотите использовать поиск на основе XPath, попробуйте github.com/code4craft/xsoup

Govinda Sakhare 19.12.2020 11:43

я проверю ссылку, и если она решит мою проблему .. я приму / проголосую за ваш комментарий

Satish Rongala 19.12.2020 11:48

Спасибо, Говинда, XSoup решил проблему, но я хочу поместить некоторую важную информацию, которую разработчики XSoup остановили давным-давно. Итак, кто когда-либо ссылался на этот ответ, пожалуйста, используйте xsoup с версией jsoup 1.11.3, иначе вы получите исключение

Satish Rongala 19.12.2020 12:11

Другие вопросы по теме