问题标签 [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.
automation - 如何编写自动填充用户输入的 ksh 脚本?
有没有办法在 ksh 脚本中自动化用户输入?
我意识到,在许多情况下,您可以创建一个期望脚本来完全按照我的意思执行,但是服务器上没有安装期望,并且在不久的将来不可能发生这种情况。但我仍然需要一种自动化用户输入的方法,因此唯一需要的反应就是启动脚本。
c# - WndProc(ref Message m),防止最小化游戏,发送击键
概述:
我将创建一个与游戏和其他应用程序交互的触摸应用程序。这个概念类似于touch-buddy.com上的应用程序,但我将使用 C# 和 WPF,而不是使用 Perl 编写应用程序的方式。
我想评估一些挑战。touch-buddy 应用程序在与游戏交互时使用两种方法;
- 客户端模式(同一台机器运行游戏和触摸伙伴)。
- 服务器/客户端模式,其中一个单独的盒子向游戏机发送命令。
我相信这种方法的原因是为了规避游戏最小化的问题。
在仅客户端模式下,我遇到的问题是,我触摸了一个屏幕,而不是查看游戏的主屏幕,然后游戏最小化。并非所有游戏都有这种行为,但我想征服那些可以最小化和防止它的游戏。
是否可以保持游戏的前沿和中心集中并防止最小化使用 C# WndProc(ref Message m)?
我一直在尝试使用WndProc(参考消息 m),在其中创建了一个 win 表单,当我在自己的 Win 表单上按最小化时,它将关闭一个记事本实例。这向我证明了我可以捕获一条消息,防止该消息冒泡,然后将一条消息发送到另一个应用程序。然后我尝试用我的触摸屏点击记事本,让我的 win 表单应用程序保持焦点而不是最小化。在这一点上,我不成功。我需要更多时间来理解消息代码。
这是正确的方法吗?可以做到吗?我应该查看其他库,例如 Windows 自动化吗?
关键输入是我关心的另一个问题。将击键发送到其他应用程序/游戏的最佳方式是什么。我应该使用 DirectX,使用某种发送键,自动化框架吗?这些中的任何一个都可以处理某些模拟游戏所需的多个击键吗?
我感谢您可能拥有的任何链接和/或见解。如果您出于任何原因走上了这条路,我很想听听您的意见。
斯坦
wpf - 如何从 UI 自动化框架获得 WPF UserControl DependencyProperty 的值?
我无法通过 UI 自动化框架访问我的 WPF UserControl DependencyProperty 值。
我以 MSDN 中的 James McCaffreys 文章作为起点(Automating IO Tests in WPF Applications,MSDN March 2009),但我只能在标准控件(如按钮)中查看属性等。
我假设我必须在我的 UserControl 上实现一些自动化接口,但是什么以及如何实现?
我已经可以很好地看到我的控件,例如在 UISpy 中,但是我看不到其中的依赖属性。这是我的用户控件当前在 UISpy 中的样子:
AutomationElement 通用辅助功能 AccessKey:“”AcceleratorKey:“”IsKeyboardFocusable:“False”LabeledBy:“(null)”HelpText:“开关48v幻象电源开/关(仅用于麦克风输入)。”
状态 IsEnabled:“True” HasKeyboardFocus:“False”
标识 ClassName:“”ControlType:“ControlType.Custom”Culture:“(null)”AutomationId:“V48SwL”LocalizedControlType:“custom”名称:“”ProcessId:“5684(VirtualSix)”RuntimeId:“7 5684 40026340”IsPassword: “假” IsControlElement:“真” IsContentElement:“真”
Visibility BoundingRectangle: "(140, 457, 31, 20)" ClickablePoint: "155,467" IsOffscreen: "False"
控制模式
c# - UI-Automation cmdlet 找不到控件
我正在尝试使用 MSFT 提供的 UI-Automation 框架测试 WPF 应用程序。编写了一些 powershell 脚本,它们调用为操纵应用程序的可视控件而创建的 cmdlet。
我的应用程序中有一个下拉菜单,其中包含一个条目“DropDownEntry”。在我的 cmdlet 中,我正在尝试执行以下操作:
上面给定的代码片段在执行时返回“null”,这基本上意味着上面给定的逻辑无法找到我的下拉条目。
有人可以告诉我为什么会发生这种情况吗?我检查了我的控件的名称和值。一切似乎都井然有序。我不确定为什么会发生这种情况。任何帮助将非常感激。
谢谢
c# - 已启用 UI 自动化按钮样式
我正在评估 UI 自动化以进行 UI 测试,因为我有一个定义了以下按钮的 WPF 应用程序:
当我需要在视觉上禁用该按钮时,我只需更改样式,以便用户知道该按钮已禁用(颜色已更改),但该按钮仍然在内部启用,因此我仍然可以启动 OnClick 事件以便在何时显示消息用户单击“禁用”按钮。
现在的问题是我不知道如何从 UI 自动化中检查其当前应用的样式,即按钮是否被禁用或启用。你知道我该怎么做吗?
在正常情况下,我应该这样做:
但在我的情况下,按钮始终处于启用状态,因此我需要检查应用于按钮的样式。
非常感谢你。
最好的祝福
c# - 如何使用 UIAutomation 设置 MDI 子窗口的焦点
我们有一个旧的遗留应用程序需要自动化。它使用 MDI 窗口。
我们正在使用UIAutomation,我可以成功地为每个 MDI 子窗口获取适当的 AutomationElement。我不能做的是把那个元素放在焦点上。
这是我尝试过的一些示例代码,但失败了:
此代码中的最后一行因 System.InvalidOperationException 而失败
实验中,我尝试在 childWindow 上找到一个控件,并在其上调用 SetFocus。它确实正确地将焦点设置在正确的控件上,但它没有将 MDI 窗口带到前台。
有任何想法吗?
c# - Hudson 似乎没有运行 Process.Start 正确
对于一个项目,我必须在 C# 中启动一个应用程序,撕掉与流程相关的 AutomationElement 树,然后关闭应用程序并输出树。我通过使用 Process.Start 打开应用程序来做到这一点。然后,我找到了与生成的进程相关的 AutomationElement,并结合使用 TreeWalker 和 AutomationElement 的 FindFirst 和 FindAll 方法来遍历树。
这在我的计算机上运行良好,并在本地使用 NUnit 正确运行。它也可以在我组计算机中的其他人上运行。问题是它永远不会在我们运行 Hudson 的中央测试服务器上运行。经过几个小时的调试,我在 Hudson 上进行了测试,启动应用程序,然后打印第一级 AutomationTree。在我的电脑上,这会打印我桌面上的所有窗口。在 Hudson 上,这仅打印桌面。
考虑到可能有多个桌面,我尝试在 RootElement 上使用 TreeWalker 的 GetNextSibling 函数。它仍然只报告了一个桌面。
这是我用来启动进程的代码。
sApplicationPath 设置为可执行文件的绝对路径。iInitialDelay 是确保应用程序有时间启动的延迟。我在 Windows Vista SP2 上的“C:\Windows\System32\notepad.exe”上运行它,并使用 v3.5 C# 编译器对其进行编译。
FindChildProcessById 定义如下:
请记住,这可以在我的计算机上编译并运行。我在 Hudson 上的测试程序说 RootElement 根本没有孩子。
所以我启动应用程序,确认它存在,然后我找不到与该进程关联的任何窗口。除了桌面,我找不到任何与任何东西相关联的窗口。
这是哈德森的问题吗?Hudson 是否以某种特定方式工作,而该代码无法在其上工作?我的代码有问题吗?Hudson 服务器在 Windows Server 2003 计算机上运行。任何帮助,将不胜感激。我知道这是一个非常具体的问题,这就是我在网上找不到任何解决方案的原因。
wpf - 如何在对项目进行分组的 WPF ItemsControl 上使用 UI 自动化?
我正在使用Microsoft UI 自动化(即AutomationElement
)对我的应用程序运行自动化验收测试。这进展顺利,但我遇到了似乎没有暴露于自动化框架的情况。
我有一个ItemsControl
(尽管我可以使用它的派生控件之一,例如ListBox
),并且我正在使用CollectionViewSource
对项目进行分组。这是一个完整的窗口来演示:
这会生成一个窗口,其中包含分组到其类别中的项目,并且每个项目都有一个我想使用 UI 自动化单击的按钮:
(来源:brizzly.com)
但是,如果我查看UISpy.exe(或使用 导航AutomationElement
),我只会看到组(即使在原始视图中):
(来源:brizzly.com)
如您所见,这些组在那里,但它们不包含任何项目,因此无处可寻按钮。我已经在 WPF 3.5 SP1 和 WPF 4.0 中尝试过这个并得到相同的结果。
是否可以在分组的项目上使用 UI 自动化,如果可以,如何?
cookies - How to explicitly add a cookie in Watir?
I need to set a cookie in IE to execute some specific flow. I tried using the following code
ieb = Watir::IE.new
ieb.document.cookie="rememberme=foobar;Path=/; Domain=sometestdomain.com"
# Bring up browser and do bunch of stuff
However, I see that when the IE comes up, rememberme cookie is not set. Am I doing something wrong here?
c# - 当只需要几个方法时,有什么方法可以避免创建一个巨大的 C# COM 接口包装器?
大家好,
我正在开发一个 C# 程序,该程序需要能够在 Windows 7 Explorer 的新 ItemsView 控件中获取热门项目的索引。幸运的是,Microsoft 提供了一种通过 UI 自动化执行此操作的方法,即查询控件的自定义属性。
不幸的是,System.Windows.Automation 命名空间莫名其妙地似乎没有提供查询自定义属性的方法!这让我不得不完全放弃 C# 自动化命名空间并仅使用非托管 COM 版本。一种方法是将所有自动化代码放在一个单独的 C++/CLI 模块中,并从我的 C# 应用程序中调用它。但是,如果可能,我想避免使用此选项,因为它会向我的项目添加更多文件,并且我不得不担心 32/64 位问题等。
另一种选择是使用 ComImport 属性来声明相关接口并通过 COM-interop 完成所有操作。这就是我想做的。但是,IUIAutomation 和 IUIAutomationElement 等相关接口非常庞大。它们总共有数百种方法,并且引用了大量的接口(我假设我也必须声明),几乎所有这些我永远不会使用。我认为 UI 自动化接口也没有在任何类型库中声明,所以我不能使用 TLBIMP。
有什么方法可以避免手动将 bajillion 方法签名转换为 C#,而只声明我实际需要的十个左右的方法?我看到 C# 4.0 添加了一种新的“动态”类型,它应该可以简化 COM 互操作;这和我的问题有关系吗?
谢谢