问题标签 [automationelement]
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.
c# - 尝试从 Edge 读取 URL,Process.MainWindowHandle = 0 表示“MicrsoftEdge.exe”进程
我正在尝试编写 Edge -> Chrome 服务,因此我使用 ManagementEventWatcher 创建“边缘启动”事件。
从事件我得到processId,从processId我得到进程,从进程我得到主窗口句柄。
烦人的是,当我将事件观察程序设置为监视 MicrosoftEdgeCP 时,我得到一个主窗口句柄,当我将它设置为 MicrosoftEdge 时,我什么也得不到。
我尝试使用 AutomationElement 导航 MicrosoftEdgeCP(认为我可以从中提取 url),但是当我使用 .FindAll(TreeScope.Children, Condition.TrueCondition) 时,我得到零个孩子。
所以我暂时称它为一个晚上,任何建议将不胜感激:)
c# - 目标应用程序进程中的 UIA 自动化元素 GDI 泄漏
我创建了自己的扩展方法,其中包含自动化元素实现,用于在运行时查找任何 Win32、WPF 控件。
我已将动态属性和父控件作为输入,并使用 UIA 概念找到控件,并再次将控件作为 CodedUI 控件 (WinControls/WpfControls) 返回。
我已经实现了这个概念,因为使用 CodedUI 没有识别一些自定义控件,在实现这个 UIA 概念之后,自动化代码的稳定性得到了提高。
在将脚本作为 Smoke/Regression 执行时,没有遇到任何问题,但是在使用 CycleTest 执行相同操作时(就像我们曾经重复运行 Smoke 脚本 30 次一样)在 Target 应用程序进程中始终出现 GDI 内存泄漏,而我没有面临UIMaps 的这类问题。
我尝试了很多方法来释放 GDI 对象,但没有一个对我有帮助。已将我的包装方法放在这里。
c# - 使用自动化事件c#获取正在关闭的窗口的名称
我正在做一个项目,我需要获取正在关闭的窗口的名称。我为此使用 C# 自动化事件。
我已经粘贴在我正在使用的代码下面:
关闭任何窗口时都会触发上述代码,但执行时出现以下错误:
- 变量sender的值为null。
- 无法获取自动化元素的Current.Name(我大部分时间都收到此错误)
在调试时,我发现第二个错误是由于在完成事件处理程序执行之前关闭窗口所致。
请让我知道如何修复这些错误并获取触发关闭的窗口的名称。
提前致谢
c# - 来自句柄或 AutomationElement 的 TestStack.White 窗口
我一直无法通过仅使用自动化元素或窗口句柄来获取测试堆栈窗口对象。通过查看源代码,我可以看到此功能受到保护。
有没有人知道一个简单的方法来做到这一点。没有先找到应用程序,然后使用窗口查找器功能,因为我已经知道窗口。
谢谢丹
c# - C# 中带有 IExpandCollapseProvider 的自定义 FrameWorkElementAutomationPeer 的内存泄漏
我们使用 AutomationUIClient 控制台应用程序来测试我们的 WPF 应用程序。
我们在 WPF 应用程序中设置了一个自定义类 TreeItemAutomationPeer 与 ISelectionProvider 和 IExpandCollapseProvider
如果此对象由自动化应用程序控制台使用,则所有者(在我的情况下为 TreeItem)被保留,因此它会泄漏......
我们添加最后一个方法 GetChildrenCore() 以防止来自 Children 的内存泄漏。
TreeItem 类实现 IRawElementProviderSimple
这是 DotMemory 的泄漏:
当我拍摄快照时,控制台应用程序仍附加到 WPF 应用程序。
如何从 ExpandCollapseProviderWrapper 释放 TreeItemAutomationPeer 的所有者以防止泄漏?
在控制台应用程序中,我们获得了 AutomationElement 对象。是否有我们使用的所有 AutomationElement 的列表以及释放它们的方法?
非常感谢 :)
虽然真实
编辑 :
根据 dotmemory 文档 ( https://www.jetbrains.com/help/dotmemory/Analyzing_GC_Roots.html ) RefCounted 句柄是:
如果对象的引用计数是某个值,则根会阻止垃圾收集。如果使用 COM Interop 将对象传递给 COM 库,CLR 会为此对象创建一个 RefCounted 句柄。由于 COM 无法执行垃圾回收,因此需要此根。相反,它使用引用计数。如果不再需要该对象,COM 将计数设置为 0。这意味着 RefCounted 句柄不再是根,可以收集该对象。因此,如果您看到 RefCounted 句柄,那么很可能该对象作为参数传递给非托管代码。
c# - Windows UIAutomationElement 内存泄漏
我有一个 WPF 应用程序需要自动化以进行测试。有一个使用 Windows UIAutomation 框架执行此操作的现有工具。
问题是当我尝试访问主应用程序上的元素并触发它们时,内存被分配在主应用程序上,并且无法强制对其进行 GC。更重要的是,如果没有找到页面上的元素并且执行了多次重新托盘,则有更多的内存要分配而不是释放。我相信问题来自AutomationElement类的Find和FindAll方法。
这个问题似乎很老了,没有通用的解决方案[1][2]。
自动化框架会进行一些缓存以更好地访问 UI 元素。我想到的一种可能的解决方案是禁用 UI 元素的缓存或强制清除缓存。以前有没有人这样做过并且可以帮助我?
另外,您还有其他解决方案来解决由 Windows UI 自动化框架引起的内存泄漏问题吗?
我在 Win7 和 Win10 机器上进行了测试。
automation - Windows Automaton - InvokePattern 阻止执行,直到一切都完成
我在我的自动化应用程序中遇到过这种行为:当我通过调用该InvokePattern.Invoke()
方法“单击”一个按钮时,一切都会停止,直到自动化应用程序内的单击事件处理程序完成。
虽然这可以使一些事情变得简单(例如,我不必编写大量代码来等待带有进度条的对话框消失,因为我只是在一切完成后重新获得控制权),但我做不到还要别的吗。它甚至会阻止对另一个线程中的自动化 API 的访问,在单击处理程序完成后它会继续。
当自动化应用程序中的单击处理程序打开模式对话框时,这会导致问题,然后我无法执行任何操作,通过自动化 API 对应用程序的访问被阻止,直到手动关闭对话框。
有没有人以某种方式解决了这个问题并且可以帮助我?
谢谢,卡雷尔
PS:参考来源是这样说的:
编辑:它在自动化不是 .NET 应用程序的 Windows 记事本应用程序时完美运行。它不适用于记事本克隆(C# WinForms 应用程序)。
c# - TestStack.White - 使用 SearchCriteria.ByNativeProperty
查看所有这些参数,“LabeledBy”参数似乎是识别元素的最佳参数。我正在使用 TestStack.White 进行自动化并以这种方式进行了尝试:
TestStack.White.UIItems.IUIItem[] IUIArr = GetMainWindow().GetMultiple(TestStack.White.UIItems.Finders.SearchCriteria.ByNativeProperty(System.Windows.Automation.AutomationElement.LabeledByProperty, NUnit.Framework.Is.EqualTo(TestStack.White.UIItems.Finders.SearchCriteria.ByNativeProperty(System.Windows.Automation.AutomationElement.NameProperty, "NLP*"))));
GetMainWindow()
是一个函数,返回应用程序的 MainWindow 并且它工作正常。
我的主要问题是,我得到一个例外的文本Der PropertyCondition-Wert für die AutomationElementIdentifiers.LabeledByProperty-Eigenschaft muss "AutomationElement" sein
是什么意思翻译的东西The value for property condition of an AutomationElementIdentifier.LabeledByPropery has to bei "AutomationElement"
我的第二个但不是很重要的问题是:我真的只需要为那个 Is.EqualTo-Function 引用 NUnit 吗?通常我会尽量避免引用外部 DLL,只针对一种方法。
不幸的是,我对使用 nativSystem.Windows.Automation
库不是很熟练,但是没有 TestStack.White 的解决方案也会有所帮助。
c# - C# - 哪个接口未注册,如何注册?
我正在尝试编写一个控制台应用程序,它将在 Windows 10 上的任何打开的程序中导航 AutomationElement 树。我的应用程序实际上适用于我尝试过的每个打开的程序......除了 Chrome。某些 Chrome 安装工作,但有些不工作。这种差异似乎没有任何明显的原因。我找到了这篇博文,作者解释说 Chrome 的 AutomationElement 树是不可访问的,并提供了 C# 代码以使其可访问。想我会试试的。
我必须重写大量的函数才能让它编译和运行,如下所示(通过将我的代码与博客文章进行比较)。
我还必须Win32
从头开始创建他引用的类,因为博客文章没有解释它是什么或它来自哪里。我发现以下两个链接对重新创建Win32
课程非常有帮助。
- https://www.pinvoke.net/default.aspx/oleacc.accessibleobjectfromwindow
- http://pinvoke.net/default.aspx/Interfaces/IServiceProvider.html
签名似乎是正确的,所以我认为我在正确的轨道上。这是我的课。
我遇到的问题try-catch
在于我的GetIAccessible2()
功能。在那之前,一切似乎都运行良好。但是在那条线上,我调用QueryService()
函数的地方,我得到错误“接口未注册”。它没有告诉我哪些接口没有注册,也没有告诉我如何注册。
坦率地说,大部分代码对我来说都是相当神秘的,我很惊讶我已经做到了。但是,我需要它来实际工作,而且还没有。
哪些接口未注册,如何注册?
我非常感谢您能提供的任何帮助(最好是简单的英语,使用任何必要的代码)!
提前致谢!
[编辑]
我修复了我的错误。但是,我不确定它是否修复了 Chrome。这是我为感兴趣的各方提供的新代码。