我试图使用.NET UIAutomation OR White框架找到所有桌面窗口.我试过了 :
1.)
AutomationElement rootElement = AutomationElement.RootElement;
var winCollection = rootElement.FindAll(TreeScope.Subtree, Condition.TrueCondition);
Run Code Online (Sandbox Code Playgroud)
2.)
Desktop.Instance.Windows();
Run Code Online (Sandbox Code Playgroud)
两者都抛出ArgumentException.如果还有其他方法可以让我知道......
更新/答案:Desktop.Instance.Windows(); 工作正常,但它在使用VS2010调试代码时抛出异常.
所以我正在用White进行一些C#自动化/ UI测试,并且遇到了麻烦.我在应用程序中有一个DataGridView,我根据应用程序状态设置不同的背景单元格颜色.我想在使用White的测试期间检查这些颜色,但是我很难这样做.
这就是我想要做的工作.我可以获得网格视图,但只能作为表格.然后,我以后遇到问题因为我最终使用普通的TableCell而不是DataGridViewCells.
var Table = MainWindow.Window.Get<Table>("DataGridViewName");
var Row = Table.Rows[0];
var Cell = Row.Cells[0];
//invalid
//var Color = Cell.Style.BackColor;
Run Code Online (Sandbox Code Playgroud)
有没有人遇到这个或有任何建议?
我试图通过UI Automation自动测试我的应用程序(主要TestStack.White用于提供友好的界面;它System.Windows.Automation用作后端).我有一个约200行的表,我需要测试它的值(实际上我只想测试第一行和最后几行).我发现使用COM-interop UIAutomationCore本身,我可以在几分之一秒内枚举行,但只有当我不使用White或System.Windows.Automation.一旦System.Windows.Automation初始化,未来的UI自动化行动枚举行是缓慢的:
First COM run: it took 0.04 seconds to get 102 rows!
First System.Windows.Automation run: it took 7.18 seconds to get 102 rows!
Second COM run: it took 7.87 seconds to get 102 rows!
Run Code Online (Sandbox Code Playgroud)
我创建了一个简单的WinForms测试应用程序(TableTest.exe以验证它是否System.Windows.Automation与我的应用程序无关:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var form = new Form() { Text = "TableTest", WindowState = FormWindowState.Maximized };
var dgv = new DataGridView() { Name = "DGV", Dock = DockStyle.Fill, …Run Code Online (Sandbox Code Playgroud) c# white-framework ui-automation winforms microsoft-ui-automation
我无法从流程内部收听自动化事件.我在下面写了一个示例,其中有一个带有单个按钮的简单WPF应用程序.使用TreeScope:Descendants在窗口上为Invoke事件添加自动化处理程序.
public MainWindow()
{
InitializeComponent();
Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
IntPtr windowHandle = new WindowInteropHelper(this).Handle;
Task.Run(() =>
{
var element = AutomationElement.FromHandle(windowHandle);
Automation.AddAutomationEventHandler(InvokePattern.InvokedEvent, element, TreeScope.Descendants,
(s, a) =>
{
Debug.WriteLine($"Invoked:{a.EventId.Id}");
});
});
}
private void button_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine("Clicked!");
}
Run Code Online (Sandbox Code Playgroud)
当我点击按钮时,这就是我得到的:
Invoked:20009
Clicked!
Invoked:20009
Run Code Online (Sandbox Code Playgroud)
为什么Invoked事件被处理两次?
如果我删除Task.Run我只能得到它一次,但我已经阅读了几个你不应该从UI线程调用自动化代码的地方(例如https://msdn.microsoft.com/en-us/ library/ms788709(v = vs.110).aspx).在真实代码中这样做也是不切实际的.
我在此示例中使用了UIAComWrapper库,但是我对UIAutomationClient库的托管版和COM版都有相同的行为.
在谈论自动化UI测试时,对话总是最终得到UI自动化.这是唯一的选择吗?
我个人不喜欢它的一个主要原因 - 复杂性.它适用于所有类型的应用程序.这种普遍性永远不会免费.UIA引入了另一层抽象和一个相当复杂的API.标准模式是有限的.自定义控件支持需要大量编码.我想知道为什么有人认为这是一个不错的选择?
WPF具有辉煌和非常丰富的抽象,其中UI是视觉元素的分层树.这些元素暴露了许多方法,事件和属性.树支持各种引用方式(例如相对源语法).我们在UIA中放弃了所有这些.为了什么?为了兼容旧式应用和网络?实际上,谁会需要呢?所有行业的杰克都是无所不能的大师.
像Snoop这样的工具可以将自己注入到正在运行的应用程序中并完全控制它.他们可以更改控件属性的值并引发事件.那不够吗?不.您希望您的测试能够像用户一样使用鼠标和键盘与UI进行交互.但这是另一个可以解决的问题.
所以我想知道,有什么我不了解UIA的快乐吗?
White正在向控制台输出大量日志,我想将其关闭以查看输出.这怎么可能?我尝试了以下但仍然看到日志.是否需要添加更多代码?
void func()
{
CoreAppXmlConfiguration.Instance.LoggerFactory = new WhiteDefaultLoggerFactory(LoggerLevel.Off);
// Open application and perform actions...
}
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个从命令行开始测试的解决方案.
我也想从詹金斯开始.我认为从命令行最简单,所以我将它添加到我的管道配置(Jenkinsfile)
stage('Run UI Tests') {
steps {
bat('"C:\\PATH_TO_MSTEST\\mstest" /testcontainer:PATH_TO_MY_TEST_PROJECT\\bin\\Debug\\MyTests.dll')
}
}
Run Code Online (Sandbox Code Playgroud)当我尝试从cmd启动它时,就像我使用常规单元测试一样,它不起作用.
它说:
Starting execution...
No tests to execute.
Run Code Online (Sandbox Code Playgroud)
我在开始"运行UI测试"阶段之前构建项目.
任何想法如何使其工作?可以在stackoverflow,TestStack的github问题以及网络上的其他荣耀位置找到它
我正在使用White来自动化我们的C#WPF UI的BDD测试.
我的第一个测试在我的开发机器上运行良好(运行Windows 7).但是,当我尝试在构建服务器(运行Windows Server 2003 R2的虚拟机)上运行相同的代码时,它无法正常工作.在这两种情况下,测试都是从命令行运行的,测试使用的是Cuke4Nuke框架.在服务器的情况下,我通过远程桌面连接访问服务器.
代码如下:
var application = Application.Launch("whiteApp.exe");
var initializeOption = InitializeOption.NoCache;
var windowCriteria = SearchCriteria.ByText("whiteApp");
var window = application.GetWindow(criteria, initializeOption);
var criteria = SearchCriteria.ByAutomationId("rightButton");
var button = (Button) window.Get(criteria);
button.click();
Run Code Online (Sandbox Code Playgroud)
问题是在服务器上运行按钮单击事件时不会触发它.如果在白方执行完毕后UI处于打开状态,则可以单击该按钮(使用鼠标).一个有趣的观点是,在运行click方法后,按钮确实显示了被点击的证据,如下图所示,在其他按钮的情况下,显示了鼠标悬停效果.

我正在测试一个加载powerpoint(.ppt或.pptx)文件的应用程序插入它.当文件加载到应用程序内部时,应用程序给出了类似powerpoint的感觉和一些额外的设置.当我尝试自动化应用程序时,我单击一个按钮将powerpoint文件加载到应用程序中.加载过程后,白色框架无法继续播放.
当我再次重新启动相同的测试时,我得到了" 检测到NonComVisibleBaseClass "异常.
我只能在重新启动整个应用程序后继续我的测试.有人遇到过这种问题吗?您的答案对我的测试非常有帮助.
white-framework ×10
c# ×4
testing ×2
ui-testing ×2
wpf ×2
automation ×1
bdd ×1
datagridview ×1
forms ×1
java ×1
jenkins ×1
open-source ×1
teststack ×1
uia ×1
unit-testing ×1
winforms ×1