Я пытаюсь выполнить функцию 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)
пожалуйста, дайте мне знать, если данные требуются с моей стороны.
«Интерфейс XPathResult представляет результаты, сгенерированные путем оценки выражения XPath в контексте данного узла. Поскольку выражения XPath могут приводить к различным типам результатов, этот интерфейс позволяет определять и обрабатывать тип и значение результата».
Я также выполнил отладку, но не обнаружил никаких проблем с кодом... и multicode String в коде, который я пытаюсь выполнить.
Вы пробовали использовать другой xpath, кроме //input?
Да, я пытался, но получаю XapthResult не определено
Возможно, загруженный документ не является допустимым файлом HTML или XML. У меня нет идей...
String testCode = "var demo=function(document){return document.getElementById('address');}"; я пробовал с этой функцией, и я могу получить результат..



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема с вашим кодом в том, что вы используете 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 .. поэтому я пытаюсь использовать этот
@SatishRongala, если я не ошибаюсь, вы пытаетесь найти количество полей input, верно? Добавьте больше деталей к вопросу о том, что именно вы пытаетесь сделать.
Да, я пытаюсь найти количество полей ввода на веб-странице с помощью xpath
Вы можете искать и подсчитывать теги input, используя jsoup. Но если вы строго хотите использовать поиск на основе XPath, попробуйте github.com/code4craft/xsoup
я проверю ссылку, и если она решит мою проблему .. я приму / проголосую за ваш комментарий
Спасибо, Говинда, XSoup решил проблему, но я хочу поместить некоторую важную информацию, которую разработчики XSoup остановили давным-давно. Итак, кто когда-либо ссылался на этот ответ, пожалуйста, используйте xsoup с версией jsoup 1.11.3, иначе вы получите исключение
Возможно, DOM не загружается при запуске скрипта или у вас могут отсутствовать результаты для XPath.