AlexanderBobryakov · GitHub

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:
image

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'

Read the original on github.com ↗