【问题标题】:HtmlUnit Javascript: Cannot read property "style" from nullHtmlUnit Javascript:无法从 null 读取属性“样式”
【发布时间】:2019-07-19 07:40:11
【问题描述】:

我在使用 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] column=[0] lineSource=[null] name=[TypeError] sourceName=[xxx/startwlm/Start_Wlm.htm 中的脚本来自 (23, 54) 到 (223, 10)] message=[TypeError: 无法读取属性 来自 null 的“样式”(来自 (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)

【问题讨论】:

  • 错误信息意味着.style左边的任何东西都是空的,在这种情况下,三个document.getElementById()调用之一返回空白。

标签: javascript java htmlunit


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您需要确保 document.write(''); 之前运行 document.getElementById('leftcolmnmain').style.display = 'block'; 代码行,否则它会像你的情况一样抛出异常,如 document.getElementById('leftcolmnmain') 那么将为空。

    【讨论】:

    • 我不太明白。我必须在代码中添加什么才能使其正常工作?
    • 如何影响它?无法从网站编辑 Javascript 代码
    • 抱歉延迟响应,希望现在它已经得到解决。您可以添加 null 检查以确保安全,然后进行验证。
    【解决方案3】:

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

    • 添加 webClient.getOptions().setThrowExceptionOnScriptError(false);让js引擎在出错后继续运行(就像真正的浏览器一样)
    • 添加 webClient.waitForBackgroundJavaScript(10_000); AFTER HtmlPage page = client.getPage("xxx");让 jsEngine 在点击之前完成整个(异步)工作

    最后为什么你使用 js 来点击——你可以直接从 java/Htmlunit 触发 click()

    【讨论】:

    • 谢谢....但遗憾的是它不起作用。 "HtmlPage 页面 = client.getPage("xxx");"产生失败,下面的行。您还有其他解决方案吗?
    • 是否有机会提供一个小的完整的可复制样本(可能通过私人邮件)?
    • 这是专用网络中的打印机 Web 覆盖。那并没那么简单。源代码截图会有帮助吗?
    • 不是真的,但可能是'xxx/startwlm/Start_Wlm.htm'的源代码(至少如果里面的js没有被混淆如果你可以在github上打开一个问题会很酷这让我更容易追踪。
    • 我宁愿给你发一封带有源代码的私人邮件。在stackoverflow上,您不能发送私人消息,可以吗?你能给我你的电子邮件地址或其他联系方式吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2021-10-31
    相关资源
    最近更新 更多