I have the scenario described in the test below. I receive javascript code that contains document.body.append(...) fragments, but when it is executed, an error is thrown. But the javascript code is completely valid (see dom-parentnode-append).
@Test void shouldSuccessJs() throws IOException { final var url = new URL("http://localhost:8080/"); final HtmlPage page = createWebClient(url).getPage(url); final var js = """ let div = document.createElement('div'); div.innerHTML = "Hello"; document.body.append(div); """; assertDoesNotThrow(() -> page.executeJavaScript(js)); } private WebClient createWebClient(URL url) { final WebClient webClient = new WebClient(BEST_SUPPORTED); final var mockWebConnection = new MockWebConnection(); mockWebConnection.setResponse(url, "<html><body></body></html>"); webClient.setWebConnection(mockWebConnection); webClient.getOptions().setJavaScriptEnabled(true); webClient.getOptions().setCssEnabled(false); return webClient; }
Exception:
Caused by: net.sourceforge.htmlunit.corejs.javascript.EcmaError: TypeError: Cannot find function append in object [object HTMLBodyElement]. (injected script#3)
at app//net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:4635)
at app//net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:4616)
at app//net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.typeError(ScriptRuntime.java:4648)
at app//net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.typeErrorById(ScriptRuntime.java:4653)
at app//net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.notFunctionError(ScriptRuntime.java:4732)
at app//net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.getPropFunctionAndThisHelper(ScriptRuntime.java:2618)
at app//net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.getPropFunctionAndThis(ScriptRuntime.java:2601)
at app//net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1663)
at app//net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:1053)
at app//net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:89)
at app//net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:392)
at app//com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:335)
at app//net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3916)
at app//net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.exec(InterpretedFunction.java:102)
at app//com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$2.doRun(JavaScriptEngine.java:870)
at app//com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:984)
... 98 more
As I understand it, this happens because the com.gargoylesoftware.htmlunit.javascript.host.html.HTMLBodyElement class does not have the append() method:

If I use the appendChild() method instead of append() in the javascript code, then everything works correctly. But I can't manage this javascript code in my application (it comes from business clients at runtime).
How can I solve this problem? Can you add an append() method for com.gargoylesoftware.htmlunit.javascript.host.dom.Node?
I use dependency implementation 'net.sourceforge.htmlunit:htmlunit:2.69.0'