【发布时间】:2015-03-19 09:16:41
【问题描述】:
所以我有一个 Ember 应用程序,我需要为抓取目的拍摄快照。 Ember 应用程序使用 Google+ API 来唱歌。它还在索引页面中嵌入了一个 Youtube 视频。我用HtmlUnit v2.15。
我正在使用以下代码来初始化 HtmlUnit:
// use the headless browser to obtain an HTML snapshot
final WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setActiveXNative(true);
webClient.getOptions().setAppletEnabled(true);
webClient.getOptions().setCssEnabled(true);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setThrowExceptionOnScriptError(false);
HtmlPage page = webClient.getPage(originalUrl);
// important! Give the headless browser enough time to execute JavaScript
// The exact time to wait may depend on your application.
webClient.waitForBackgroundJavaScript(5000);
// return the snapshot
logger.info("Writing snapshot for URL: " + originalUrl);
response.getWriter().write(page.asXml());
webClient.closeAllWindows();
-
现在,所有 3 个主要浏览器版本(CHROME、INTERNET_EXPLORER_11、FIREFOX_24)都会出现一个问题:
runtimeError: message=[An invalid or illegal selector was specified (selector: '*,:x' error: Invalid selector: *:x).] sourceName=[http://www.domain.com/assets/vendor.js] line=[1351] lineSource=[null] lineOffset=[0]
来自 vendor.js 的片段:
// Opera 10-11 does not throw on post-comma invalid pseudos
div.querySelectorAll("*,:x"); // line 1351 is the problem
rbuggyQSA.push(",.*:");
-
然后,只有 FIREFOX_24 和 INTERNET_EXPLORER_11 出现以下类型的错误:
Invalid rpc message origin. https://accounts.google.com vs http://www.domain.com Invalid rpc message origin. https://apis.google.com vs http://www.domain.com -
这只发生在 INTERNET_EXPLORER_11:
runtimeError: message=[Automation server can't create object for 'ShockwaveFlash.ShockwaveFlash.7'.] sourceName=[https://s.ytimg.com/yts/jsbin/www-embed-player-vflWiCusa/www-embed-player.js] line=[59] lineSource=[null] lineOffset=[0] -
最后,这只发生在 CHROME 中:
[com.gargoylesoftware.htmlunit.javascript.host.xml.XMLHttpRequest.open(XMLHttpRequest.java:534)]Unable to initialize XMLHttpRequest using malformed URL 'chrome-extension://boadgeojelhgndaghljhdicfkmllpafd/cast_sender.js'.
另外,如果我想在网络浏览器(本例中为 Chrome Linux)中检查 HtmlUnit 处理的结果,结果页面不会呈现,它只是:
This page contains the following errors:
error on line 23 at column 5: Encoding error
Below is a rendering of the page up to the first error.
embed[type*="application/x-shockwave-flash"],embed[src*=".swf"],object[type*="application/x-shockwave-flash"],object[codetype*="application/x-shockwave-flash"],object[src*=".swf"],object[codebase*="swflash.cab"],object[classid*="D27CDB6E-AE6D-11cf-96B8-444553540000"],object[classid*="d27cdb6e-ae6d-11cf-96b8-444553540000"],object[classid*="D27CDB6E-AE6D-11cf-96B8-444553540000"]{ display: none !important;}
更新:
我刚刚将HtmlUnit 更新为v2.16。
页面完全不呈现的部分原因是 Flash 插件集成似乎在 v2.16 中已修复,如下所述,以及索引页面中存在的非 UTF-8 字符。所以部分是我的坏事。所以页面现在按预期呈现,没有问题。尽管如此,仍然存在一些解析问题,如下所述。
- 未使用 CHROME 或 FIREFOX_31 修复。 已修复在 INTERNET_EXPLORER_11
- 未修复。除了 FIREFOX_31 之外,现在也出现在 CHROME 中。 已在 IE_11 中修复。
- 已在 IE_11 中修复。
- 已在 CHROME 中修复。
- 新与 CHROME、FIREFOX_31 的问题:
Rhino 运行时检测到的对象 com.gargoylesoftware.htmlunit.ScriptException:异常调用 com.gargoylesoftware.htmlunit.ScriptException 类的解析,其中 它需要 String、Number、Boolean 或 Scriptable 实例。请 检查您的代码是否缺少 Context.javaToJS() 调用。
- IE_11 的新问题:
runtimeError: message=[指定了无效或非法的选择器 (选择器:':启用'错误:语法错误)。] sourceName=[http://www.domain.com/assets/vendor.js]line=[1346] lineSource=[null] lineOffset=[0]
第 1346 行的代码段:
// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
// IE8 throws error here and will not see later tests
if ( !div.querySelectorAll(":enabled").length ) {
rbuggyQSA.push( ":enabled", ":disabled" );
}
总之,在 HtmlUnit v2.16 的最新版本中,IE_11 只有 1 个错误,而 CHROME 和 FIREFOX_31 有 3 个。因此,我将切换到使用 IE_11 并将 HtmlUnit 的日志阈值更改为 FATAL的错误,以免收到来自该 1 期的错误电子邮件。更好,我会给你,但仍然不完美。也许明年的更新? :)
【问题讨论】:
-
投反对票?真的吗?为了什么? :|
-
#1 is "ok": stackoverflow.com/questions/15145108/… 这是 jquery 中处理的异常。
-
那有什么办法可以将其标记为警告而不是来自 HtmlUnit 的错误?
-
webClient.getOptions().setThrowExceptionOnScriptError(false);
-
但是我不会得到阻止执行的实际错误,对吧?此外,它已经设置为 false,所以不会改变任何东西..
标签: javascript htmlunit