问题标签 [microsoft-ui-automation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
364 浏览

c# - UI 自动化不跟踪 Telerik 控件

我正在创建一个应用程序,它将记录所有应用程序级别和控制事件。我正在使用 White Recorder 框架,它能够跟踪不基于 Telerik 的其他控件。我想知道为什么 Telerik 控件没有被跟踪,因为它是从 System.Windows.Control 类派生的。

有什么方法可以使用 UI 自动化元素来跟踪所有 Telerik 控件。我们怎样才能做到这一点?

0 投票
1 回答
2131 浏览

c# - UISpy 和 UIA 验证在同一程序上显示不同的属性值

我有一个我正在测试的程序,它的关闭按钮在某个时间点启用,在另一个点上禁用。UISpy 在两个点都显示“isEnabled”为“真” UIAVerify 在第一个点显示“isEnabled”为“真”,第二个点为“假”

后者是我可以直观地确认为真的,以编程方式我得到与 UISpy 相同的值并且我的测试用例失败了。

使用 System.Windows.Automation;

树结构:“对话框”“程序名称”“标题栏”“程序名称”“按钮”“关闭”

有谁知道可能导致这种情况的原因?UIA 验证是否使用与 UISpy 不同的库?

0 投票
4 回答
3981 浏览

c# - WPF 中的 UI 自动化

谁能帮助我如何在 WPF 中进行 UI 自动化?我想检查网格的操作。

0 投票
1 回答
3995 浏览

c# - 是否可以获得任何窗口的选定文本,包括非 UI 自动化元素?

是否可以获得任何窗口的选定文本,包括非 UI 自动化元素?我希望能够获取任何进程的当前焦点元素的当前内容的选定文本。

我已经看到了使用 UI 自动化来执行此操作的各种示例,但这仅适用于某些似乎最近在 .NET 中开发的应用程序。我需要能够获取任何窗口的文本。

我记得不久前,一个表现得像字典的应用程序,你可以在 Windows 中的任何地方用鼠标悬停在一些文本上,它会显示一个带有定义的工具提示。这可以在 C# 和 .NET 中实现吗?

我一直在使用 WinSpy 检查似乎不适用于 UIA 的窗口内容,并且 ApplicationId 显示为空或“”。我猜 UIA 不支持这个特定的元素。当我使用 Notepad++ 进行测试时,我还注意到它使用了 Scintilla,它似乎也无法与 UIA 一起使用。

也许如果有人可以用其他方法展示一种可靠的方法,我可以对我的应用程序使用混合方法。使用 UIA 框架,如果这没有产生结果,那么它会退回到其他方法。

0 投票
1 回答
1354 浏览

c# - Windows UI 自动化 API

我一直试图弄清楚这一点,所以任何帮助将不胜感激。我在客户端中使用 UI 自动化来监视和报告另一个应用程序中的用户选择。我让代码在 Server 2003 上完美运行。然而,在 Server 2008 上,我正在监视的控件被报告为数据网格中的项目或列表。这是非常随机的,我注意到如果我继续选择控件中的行,最终控件将被报告为数据网格。在服务器 2003 上,它始终被报告为数据网格,因此我的代码运行良好。

我正在使用 Visual Studio 2010 C# 进行开发。

更新:

我想提一下,我使用 UI Spy 工具得到了相同的结果,因此源代码在这种特定情况下不相关。

0 投票
2 回答
876 浏览

c# - AutomationElement:缓存元素(通过GetCachedChildren)到“活”元素

我有一个 ComboBox 包含一个列表(这是组合框的标准),它有很多元素 - 超过 100 个。我想找到某些条目来选择它们。为了找到条目,我将给定的模式与每个元素的名称进行比较。

出于性能原因(超过 100 个元素),我在父级上使用了 CacheRequest,其范围为所有子级,因此我可以非常快速地遍历所有子级并找到我想要选择的子级的正确索引。

问题来了:我有我想要的正确索引,我也有缓存的 AutomationElement,但是由于我在 CacheRequest 中指定了 AutomationElementMode.None(我仍然需要测试它是否会对性能产生影响),我似乎不是能够将缓存的元素转换为可用于将来调用的元素(“实时”元素)。

我尝试通过NativeWindowHandle进行转换(因为有一个函数AutomationElement.FromWindowHandle),但是句柄似乎为0,所以这是没有办法的。

我还没有尝试使用缓存的 SelectionPattern - 因为 ComboBoxes 有时是定制的,我不知道这是否适用于所有情况(如果有的话)。

我有子索引,我可以获得所有可以缓存的值 - 如何获得缓存元素的工作/实时 AutomationElement?

谢谢安德烈亚斯

(在带有 win32 应用程序(作为自动化目标)的 Windows 7 64 上使用 C#,尽管这不会有太大的区别)

0 投票
2 回答
1631 浏览

c# - 导致 UI 自动化挂起的模态对话框

我正在尝试在 WPF 应用程序中实现 UI 自动化,但只要出现模式对话框,UI 自动化就会挂起,直到手动关闭对话框。

到目前为止,我已经尝试使用第二个线程关闭对话框,将应用程序设置为使用 MTA 线程,使用 RaiseEvent 引发按钮上的 Button.ClickEvent 以关闭对话框,并使用 sendinput 向对话框发送按键. 这些方法都不起作用,我还没有找到任何其他解决方法可以尝试。

有谁知道任何可能的解决方案?

0 投票
1 回答
1610 浏览

c# - 如何(正确)缓存 AutomationElements 以供将来使用?

在我的测试应用程序中,我不断地打开和重新打开一个表单。每次打开表单时,我必须将表单上的所有元素都放入一个AutomationElementCollection,以便我可以对元素进行操作。但是,重复获取这些元素似乎很昂贵(由于树导航/上下文切换等)。

我试图围绕获取元素的方法设置一个布尔值。如果第一次调用该方法,它将正常运行,并将布尔值设置为 true。如果该方法被第二次调用,它将什么也不做,因为数组已经被填充了。

但是,当我尝试对AutomationElement数组中的任何一个(第二次)执行操作时,这些元素似乎不可用。关闭表单是否会以某种方式“禁用”这些元素?每次打开表单时我都必须找到这些元素,以使它们“新鲜”吗?

我看了看CacheRequest方法,但这似乎只与访问属性/模式有关,而不是与元素有关。

这是代码/错误消息:

System.Windows.Automation.ElementNotEnabledException:引发了“System.Windows.Automation.ElementNotEnabledException”类型的异常。

0 投票
3 回答
9798 浏览

white-framework - 使用 UIAutomation .NET 在桌面上查找所有窗口

我正在尝试使用 .NET UIAutomation OR White 框架查找所有桌面窗口。我试过 :

1.)

2.)

两者都抛出 ArgumentException。请让我知道是否有其他方法可以做到这一点...

更新/回答:Desktop.Instance.Windows(); 工作正常,除了它在使用 VS2010 调试代码时抛出异常。

0 投票
1 回答
641 浏览

google-chrome - ValuePattern's SetValue does not work for Chrome browser's control like address edit (Exception thrown)

I am trying to use UIA to control browsers (ie, chrome, firefox) operations like nativate, go back, go forward and so on for some testing necessary. I tried to wrote some demo code, but met some problems. I got the AutomationElement for address edit for Chrome, and try to set url for it with ValuePattern, but I got exception below:

And I found that SetFoucus method also will got the same exception. I tried to use win32 method to send message to it, found that the element.Current.NativeWindowHandle is null. but I can see the current value from ValuePattern's current property. Just for a address that the UIA cannot find the chrome's control firstly until I called the below method ()UiaRegisterProviderCallback(IntPtr.Zero);

So, not sure what's reason for it, and is there anyway to set value for chrome's control