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

Browser.ExecScript() stopped working after updating windows

本文关键字:窗口 停止工作 更新 ExecScript Browser      更新时间:2023-09-26

我已经为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而没有任何希望摆脱它。简单来说,这意味着一旦你使用了这个技巧,你要么必须以"不等待网页加载"的方式(GoToNoWait、ClickNoWait 等(在 WatiN 中执行每一个后续操作,以免你的代码在等待浏览器返回READYSTATE_COMPLETE时冻结(当然,正如已经提到的,这永远不会发生(。
  • 这里似乎有一个更广泛的问题,因为我甚至无法访问 IHtmlWindow2 对象的属性 p.e. window.document 再次抛出未经授权的异常,使得几乎不可能将我正在运行的脚本的返回值(使用 Expando 等(传输到 C# 世界,用于 window.top.document 以外的文档(对于 window.top.document 窗口,有 IWebBrowser2.Document 可以解决问题(

更新#2:硒项目的人也注意到了这个问题:

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

为了动态调用IHTMLWindow2对象的"eval"方法(或任何其他方法(。获得与上述相同的"System.UnauthorizedAccessException"。所以这里也没有快乐。

Microsoft建议使用"eval"而不是"execscript",但是在上述实验之后,我怀疑他们指的是仅从浏览器中访问"eval"。

据我所知,到目前为止,当涉及到使用进程外(通过 COM(的"eval"的完整 IE11+ 时,似乎已被完全禁止与窗口对象的任何其他函数调用一起,唯一的例外是 .上面提到的导航2((。

事实证明,Microsoft最终放弃了在COM级别取消.execScript的决定。只需安装适用于 Windows 的最新更新,包括 kb3025390:kb3025390 之后的 IE 更新之一在 COM 级别恢复了 .execScript 功能

但是请注意,.execScript不能再通过IE的javascript访问了。在这种情况下,它已经一去不复返了。

仅供参考:这个也不起作用

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

尝试这在某些地方对我有用,但并非所有地方都

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

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

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

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

{代码}@echo关

wusa/uninstall/kb:3025390/quiet/norestart

结束{代码}

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