HtmlUnit Javascript:无法从null读取属性“样式”

时间:2019-07-19 07:40:11

标签: javascript java htmlunit

我在使用HtmlUnit时遇到问题。
我认为该网站包含一些错误的JavaScript代码,这对Firefox或Chrome来说不是问题,但对HtmlUnit来说是一个问题。

当我从下面执行Java代码时,它抛出了异常,我也在下面提到了。

我已经尝试过:

  

client.getOptions()。setThrowExceptionOnFailingStatusCode(false);   client.getOptions()。setThrowExceptionOnScriptError(false);

效果很好,我再也没有出现异常,但是我再也无法执行任何JavaScript代码了。

  

page.executeJavaScript(javaScriptCode)

从现在开始,每个javascript请求都会导致无用的值,甚至没有更改页面。

我只想执行Java代码而不会出现异常。
我希望有人能够帮助我。

我的Java代码

    WebClient client = new WebClient();
    client.getOptions().setJavaScriptEnabled(true);
    HtmlPage page = client.getPage("xxx");

网页中的部分javascript代码

function checkDeptLogin() {
        if (logintextboxvalidate == "_Dept_login")
        {
            visibleaccount();
        }

        document.getElementById('leftcolmnmain').style.display = 'block'; //Line 168
        document.getElementById('stapleid').style.display = 'none';

        if (document.getElementById('postlstinfoid') != null)
        {
            document.getElementById('postlstinfoid').style.display = 'none';
        }
    }
    document.write('<div id = "leftcolmnmain" style="display:none">'); //Line 1778 
  

EcmaError:lineNumber = [168]列= [0] lineSource = [null]   名称= [TypeError] sourceName = [来自xxx / startwlm / Start_Wlm.htm中的脚本   (23,54)到(223,10)]消息= [TypeError:无法读取属性   空的“样式”(来自(23,54)的xxx / startwlm / Start_Wlm.htm中的脚本   至(223,10)#168)] com.gargoylesoftware.htmlunit.ScriptException:   TypeError:无法从null中读取属性“样式”(脚本位于   xxx / startwlm / Start_Wlm.htm从(23,54)到(223,10)#168)

3 个答案:

答案 0 :(得分:0)

您正在尝试访问尚未插入DOM的元素的样式。考虑在添加后对其进行访问。

答案 1 :(得分:0)

您需要确保 document.write(''); 跑之前 document.getElementById('leftcolmnmain')。style.display ='block'; 代码行,否则将抛出异常,如您所见 document.getElementById('leftcolmnmain') 则为null。

答案 2 :(得分:0)

在不知道页面(并且无法复制)的情况下,我只能给出一些一般性提示:

  • 添加webClient.getOptions()。setThrowExceptionOnScriptError(false);在错误发生后让js引擎继续运行(就像真实的浏览器一样)
  • 添加webClient.waitForBackgroundJavaScript(10_000); HtmlPage页面之后= client.getPage(“ xxx”);在单击之前让jsEngine完成整个(异步)工作

最后是为什么您使用js单击-您可以直接从java / Htmlunit触发click()