我已经为 WatiN(版本 2.1)建立了一个简单的测试平台,内容如下:
var browser = new IE();
browser.GoTo("http://www.google.co.il"); // webpage doesn't matter really
browser.RunScript("alert(123)");
这仅在以下情况下有效KB3025390未安装。安装它会破坏上述测试,并出现 UnAuthorizedAccessException,其中 HRESULT 设置为 E_ACCESSDENIED。是什么赋予了?有什么解决方法吗?
更新:使用 IWebBrowser2.Navigate2 以及“javascript:console.log(123)”类型的脚本可以正常工作
- 使用这样的秘密渠道让我感到不安
-
通过 .Navigate2() 的这个反向通道运行的脚本的最大长度可能只有大约 2070 个字符(给予或接受)否则它们会被强制截断到这个长度,从而在尝试运行它们时导致 javascript 错误
- 使用 .Navigate2(),即使是最简单的脚本,将永远阻塞 Internet Explorer 的就绪状态,因为它将被设置为 READYSTATE_LOADING 而没有希望摆脱它。简单来说,这意味着一旦您使用此 hack,您必须以“不等待网页加载”的方式执行 WatiN 中的每个后续操作(GoToNoWait、ClickNoWait 等),以免您的代码冻结等待浏览器返回 READYSTATE_COMPLETE (当然,正如已经提到的,这永远不会发生)。
- 这里似乎存在一个更广泛的问题,因为我什至无法访问 IHtmlWindow2 对象的属性。 window.document 再次引发未经授权的异常,使得几乎不可能将我正在运行的脚本的返回值(使用 Expando 等)传输到除 window.top.document 以外的文档(对于 window.top .document 窗口中有 IWebBrowser2.Document 可以实现这一点)
Update#2:selenium 项目的人们也注意到了这个问题:
https://code.google.com/p/selenium/issues/detail?id=8302
还创建了错误报告:
https://connect.microsoft.com/IE/feedback/details/1062093/installation-of-kb3025390-breaks-out-of-process-javascript-execution-in-ie11
Update#3:IHTMLWindow2.setInterval 和 IHTMLWindow2.setTimeout 也会引发 UnauthorizedAccess 异常。这些方法在以下位置中未标记为已弃用:
http://msdn.microsoft.com/ko-kr/library/windows/desktop/aa741505%28v=vs.85%29.aspx
但他们最终还是遭受了同样的削减。
更新#4:我尝试了本文中推荐的方法:
https://stackoverflow.com/a/18546866/863651
为了动态调用 IHTMLWindow2 对象的“eval”方法(或任何其他方法)。得到与上面相同的“System.UnauthorizedAccessException”。所以这里也没有欢乐。
微软建议使用“eval”而不是“execscript”,但是经过上述实验,我怀疑他们指的是仅从浏览器内访问“eval”。
据我所知,到目前为止,当涉及到成熟的 IE11+ 时,使用“eval”进程外(通过 COM)似乎已与窗口对象的任何其他函数调用一起被完全禁止,唯一的例外是上面提到的 .Navigate2() 的反向通道。