【问题标题】:Microsoft UIAutomation isn't ALWAYS working on some computers. C#Microsoft UIAutomation 并不总是在某些计算机上工作。 C#
【发布时间】:2014-10-26 02:41:34
【问题描述】:

我有一些用于从 Chrome 中提取 url 的 C# 代码。 它通常适用于 Win7/Win 8.1,但在某些具有相同配置的计算机上则不起作用。而且,这些配置之间可能没有区别。 为什么会这样?

Process[] procsChrome = Process.GetProcessesByName("chrome");
foreach(Process chrome in procsChrome)
{
   if(chrome.MainWindowHandle == IntPtr.Zero)
   {
    continue;
   }
   AutomationElement mainWindow = AutomationElement.FromHandle(chrome.MainWindowHandle);
   elmUrlBar = mainWindow.FindFirst(TreeScope.Descendants,  new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));

  //elmUrlBar on some computers inited, on some NULL. But versions of Chrome are identical.
...
}

【问题讨论】:

    标签: c# google-chrome url ui-automation iaccessible


    【解决方案1】:

    这可能是 Windows 安全问题。 Windows 中有一些安全措施可以禁用从一个应用程序到另一个应用程序的通信,称为用户帐户控制 (UAC)。

    如果您通常以管理员身份启动 Visual Studio,那么它为运行您的应用程序而产生的子进程也将被提升,您的自动化可能会起作用。

    由于 UAC,在另一台机器上尝试它可能会失败。或者它可能会在禁用了某些 UAC 设置的机器上成功。

    在出现故障的机器上,我会尝试暂时禁用 UAC,如 here 所述,如果它现在可以正常工作,那么您就知道这是问题所在。实际上,即使启用了 UAC,您也可以通过将清单添加到您的应用程序,如 here 所述。

    【讨论】:

    • 感谢您的回复。我关闭了uac并重新启动pc,它没有帮助。我还尝试使用另一个类 TreeWalker 来递归所有节点,所以列表非常有限,当然也没有“url 控制”。但是在另一台机器上就可以了。可能你还有一些版本,请帮忙。
    【解决方案2】:

    (1) 在您的应用程序失败的情况下,您是否验证过 Chrome 中的辅助功能已打开?它要么必须从 Chrome 的命令行启用,要么为单个标签打开。

    (2) 您可能违反了用户界面特权隔离 (UIPI)。如果您运行的是管理员登录,这不是问题,但使用标准登录,绕过 UIPI 的要求是:

    1. 在应用程序的清单中设置 uiAccess=True。
    2. 通过有效的代码签名机构对应用程序进行签名。 (不过,您可以使用自签名的可执行文件进行测试——我们已经成功地做到了。)
    3. 将可执行文件安装到 System32 目录(或 SysWOW64 用于安装在 64 位 Windows 上的 32 位应用程序)。

    【讨论】:

    • 感谢您的回复。 1.我也尝试在firefox中找到url。在 2 台机器上找不到它。 (但在 5 台机器上没问题) 2. 我设置了 uiAccess=true,所以应用程序因错误而失败,我尝试使用 makecert 等。该应用程序正确启动,但没有找到 url。然后我复制所有文件,包括 SysWOW64 中的可执行文件,并尝试从该位置启动 - 再次找不到 url。 (可能是我做错了第三点,安装是什么意思,我做了发布文件夹的常规副本?)
    • 是的,只需将签名的可执行文件复制到 SysWOW64 即可。
    • 嗨,Alexey,我在捕获当前 Chrome URL 时也遇到了同样的问题。你找到解决办法了吗?
    【解决方案3】:

    我在服务器中遇到了类似的问题,其中UI Automation 一天工作得很好,而前一天却不行。

    具有管理员权限的人添加了一些系统环境变量并重新启动了服务器。不知道他们是如何在这一步搞砸的,但我的应用在那之后就停止了工作。

    在挫败了一天后,我决定从登录该服务器的用户帐户注销,然后重新登录。 然后我运行了我的应用程序,bam,它开始工作了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 2011-12-22
      • 1970-01-01
      • 2014-07-19
      • 2014-04-28
      相关资源
      最近更新 更多