更新窗口后,Browser.ExecScript()停止工作

时间:2014-12-19 13:17:55

标签: javascript security watin denied

我为WatiN(版本2.1)设置了一个简单的测试平台,其中包括:

var browser = new IE();

browser.GoTo("http://www.google.co.il"); // webpage doesn't matter really
browser.RunScript("alert(123)");

仅当未安装KB3025390时才有效。安装它会破坏上面的测试,其中包含HRESULT设置为E_ACCESSDENIED的UnAuthorizedAccessException。是什么赋予了?有没有解决方法?

更新:使用IWebBrowser2.Navigate2和" javascript:console.log(123)"然而,脚本的类型可以使用

  • 使用这样的反向通道让我感到不安
  • 通过.Navigate2()的反向通道运行的脚本可能只有大约2070个字符的最大长度(给予或接受)否则会被强制截断到此长度导致javascript错误在试图运行它们时
  • 使用.Navigate2(),即使使用最简单的脚本,也会阻止Internet Explorer的就绪状态,因为它将被设置为READYSTATE_LOADING而没有任何摆脱它的希望。简单来说,这意味着一旦你使用了这个hack,你就必须在WatiN中执行每一个后续操作,而不是等待网页加载"时尚(GoToNoWait,ClickNoWait等),以免你的代码在等待浏览器返回到READYSTATE_COMPLETE时冻结(这将永远不会出现如前所述)。
  • 这里似乎有一个更广泛的问题,因为我甚至无法访问IHtmlWindow2对象的属性p.e. window.document再次抛出一个未经授权的异常,几乎不可能将我运行的脚本(使用Expando等)的返回值转移到除了window.top.document之外的文件(对于窗口) .top.document窗口有IWebBrowser2.Document可以解决这个问题)

更新#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

更新#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

为了动态调用" eval" IHTMLWindow2对象的方法(或任何其他方法)。得到了相同的" System.UnauthorizedAccessException"如上。所以也没有喜悦。

Microsoft建议使用" eval" over" execscript"然而,经过上述实验,我怀疑他们正在提及访问" eval"仅在浏览器中。

据我所知,到目前为止,当谈到成熟的IE11 +使用" eval"进程外(通过COM)似乎已完全禁止与窗口对象的任何其他函数调用一起,唯一的例外是上面提到的.Navigate2()的反向通道。

3 个答案:

答案 0 :(得分:2)

事实证明,微软最终还是决定在COM级杀掉.execScript。只需安装适用于Windows的最新更新,包括kb3025390:在kb3025390带回COM级别的.execScript功能后,IE的更新之一

但请注意,.execScript不再可以通过IE的javascript访问。在这种背景下,它已经过去了。

答案 1 :(得分:1)

fyi:这个也没有用

ieInstance.Document.Script.<methodNameString>(<commaSeperatedParameterString>)

尝试在某些地方为我工作但不是所有地方

ieObject.Navigate "javascript:<methodNameString>(<commaSeperatedParameterString>)", Null, "_parent"

ieObject.Navigate2 "javascript:"<methodNameString>(<commaSeperatedParameterString>)", Null, "_parent"

现在尝试使用eval找出解决方案

答案 2 :(得分:0)

我找到了解决自动更新安装问题的方法。您只需创建一个包含以下内容的简单批处理文件即可。

{代码} @echo off

wusa / uninstall / kb:3025390 / quiet / norestart

<强> END {代码}

然后转到任务计划程序,为此批处理文件创建一个新任务,以便根据您的要求每隔一小时或每天运行一次。将其添加为系统任务,以便它在后台运行,不会影响正在运行的自动化。