【问题标题】:JavaScript not being properly executed in HtmlUnitJavaScript 未在 HtmlUnit 中正确执行
【发布时间】:2013-11-07 22:08:49
【问题描述】:

我目前正在使用 HtmlUnit 开发一些测试。它正在加载一个包含 Braintree.js(他们的表单加密库)的页面。我有一堆正在运行,但我被困在它称为加密的地方。有问题的JS是:

  (function() {
        try {
            var ab = new Uint32Array(32);
            crypto.getRandomValues(ab);
            sjcl.random.addEntropy(ab, 1024, "crypto.getRandomValues");
        } catch (e) {}
    })();

HtmlUnit 正在抛出:

EcmaError, ReferenceError, "'crypto' is not defined."

我想 HtmlUnit 不包括加密。是否可以自己包含一个加密库?

【问题讨论】:

  • HtmlUnit 不包括加密是什么意思? HtmlUnit 获取页面。您必须自己将库包含在 script 标记中。
  • 谢谢,当同一页面在真实浏览器中运行时,“加密”已解决。但是我在 HtmlUnit 中得到了未解决的错误。我一直在寻找 getRandomValues in include 的实现,但没有找到。

标签: java javascript cryptography htmlunit


【解决方案1】:

根据您的评论,我必须告诉您,HtmlUnit 对 JavaScript 来说是一件令人头疼的事情。它会抱怨很多没有定义的变量和未知的函数等等。

真正的浏览器更灵活,例如:它们接受语法不正确的 JavaScript 片段。 HtmlUnit 期望一切都是完美的,没有任何错误。此外,即使您没有错过分号,HtmlUnit 也可能会抱怨。

我的建议:

  • 确保您的 JavaScript 语法正确
  • 避免用户使用复杂的库(jQuery 似乎得到了适当的支持)
  • 如果您可以使用非最小化版本的库,那么值得一试
  • 尽量避免使用复杂的 jQuery 方法(例如:向元素动态添加事件)
  • 还有最重要的一点:尝试在不同的BrowserVersions 之间切换。事实证明,Internet Explorer(具有讽刺意味的是)在解释 JavaScript 时提供了最佳结果

【讨论】:

  • 非常感谢您的提示!我确实通过创建自己的小 crypto.getRandomValues() 方法解决了这个问题。然而,现在我已经触及了更深的东西。我可能不得不放弃这整个想法,因为脚本是由 Braintree 发布的 - 我无法控制。
  • 哦,我确实尝试了您的想法:BrowserVersion.INTERNET_EXPLORER_10,但它不包括类型 Uint32Array。好像只有 Firefox 和 Chrome 自带。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多