我的一般设置:我们编写了一个小型GUI的Excel导入程序,允许非程序员使用"Button.Click"等命令编写和执行GUI测试。底层框架是TestStack.White。导入Excel文件和其他用户交互后,测试将在System.ComponentModel.BackgroundWorker内部开始,只要我不查看(甚至与之交互)包含大量子元素的元素,它就可以正常工作。
但是,一旦我与具有许多元素的TestStack.White.UIItems.WindowItems.Window或TestStack.White.UIItems.UIItemContainer进行交互,测试执行就会结束。
通过交互,我指的是从简单的东西像非空检查或分配到本地变量,到请求其子计数等等。以下是一些终止测试执行的示例: 1)
在没有数百元素的 Windows 中,所有三个示例都能正常工作。
通过很多元素,我的意思是例如一个内部有 ScrollView 的 Window,其中包含一个带有几十甚至数百条目的表格,每个条目由3-4列文本或复选框之类的内容组成。
Backgroundworkers RunWorkerCompleted 和 Disposed 都没有被调用。我根本没有得到任何异常,即使有故意放置的 try/catch 块也一样。调试器到达导致问题的那一行后就停止了。即使等待1小时,什么也不会发生。
相反,我只得到了几个不同的“线程 {一些十六进制 id} 已使用代码 259(0x103)退出。” 在 Visual Studio 的输出窗口中,这是来自我上次的测试执行:
据我理解这条信息的意思是,线程仍然在运行。https://dev59.com/2mEh5IYBdhLWcg3wbjLc#22395548 如果我进入调试器检查导致错误的元素内容,我会发现所有在Items(具有子元素的列表)之后的元素都超时了,包括Items本身。
此外,问题不应该是主线程结束了,因为GUI仍然正常运行,就像在这个帖子中一样:Trying to step through BackgroundWorker code in debug but program ends unexpectedly。
有人有什么想法或者如何解决这个问题吗?
这是我启动应用程序的方式:
但是,一旦我与具有许多元素的TestStack.White.UIItems.WindowItems.Window或TestStack.White.UIItems.UIItemContainer进行交互,测试执行就会结束。
通过交互,我指的是从简单的东西像非空检查或分配到本地变量,到请求其子计数等等。以下是一些终止测试执行的示例: 1)
if(theElement != null){ //everything after this line does not happen. The operator doesn't seem to be overloaded
doStuff(); //it never reaches this point
}
2)
UIItemContainer pointOfInterest = theElement; //everything after this line does not happen
3)
System.Diagnostics.Debug.WriteLine("AmountOfElements: " + UIAnchor.Items.Count); //the output doesn't come. everything after this line does not happen
在没有数百元素的 Windows 中,所有三个示例都能正常工作。
通过很多元素,我的意思是例如一个内部有 ScrollView 的 Window,其中包含一个带有几十甚至数百条目的表格,每个条目由3-4列文本或复选框之类的内容组成。
Backgroundworkers RunWorkerCompleted 和 Disposed 都没有被调用。我根本没有得到任何异常,即使有故意放置的 try/catch 块也一样。调试器到达导致问题的那一行后就停止了。即使等待1小时,什么也不会发生。
相反,我只得到了几个不同的“线程 {一些十六进制 id} 已使用代码 259(0x103)退出。” 在 Visual Studio 的输出窗口中,这是来自我上次的测试执行:
The thread 0x830 has exited with code 259 (0x103).
The thread 0xfc0 has exited with code 259 (0x103).
The thread 0xc04 has exited with code 259 (0x103).
据我理解这条信息的意思是,线程仍然在运行。https://dev59.com/2mEh5IYBdhLWcg3wbjLc#22395548 如果我进入调试器检查导致错误的元素内容,我会发现所有在Items(具有子元素的列表)之后的元素都超时了,包括Items本身。
此外,问题不应该是主线程结束了,因为GUI仍然正常运行,就像在这个帖子中一样:Trying to step through BackgroundWorker code in debug but program ends unexpectedly。
有人有什么想法或者如何解决这个问题吗?
这是我启动应用程序的方式:
Application app = TestStack.White.Application.Launch(pathToExeFile);
context.setApp(app); //context is a class with static variables to eas the access to all kind of stuff, so that i access it without having 20 parameters in every method (e.g. Button.Click())
接下来,用户设置他想要测试的窗口(可能是模态窗口,也可能不是 - 但在没有数百个元素的窗口中它能够工作):
foreach (Window win in context.getApp().GetWindows()) {
System.Diagnostics.Debug.WriteLine("###SelectWindow: " + win.Name + " # " + win.PrimaryIdentification + " # " + win.Title);
if (win.Name.Equals(nameOfWindowToTest)) {
System.Diagnostics.Debug.WriteLine("###SelectWindow: gefunden");
context.UIAnchor = win;
System.Diagnostics.Debug.WriteLine("####SelectWindow: Anz Items: " + context.UIAnchor.Items.Count); //this gets called, but is the very last thing the thread does
return null; //does not happen
}
}
context.UIAnchor是上面提到的元素。然后调用用户设置的方法(例如Button.Click)。有趣的是,context.UIAnchor = win并且items.count的输出有效。
更新:如果在关闭测试程序之前关闭要测试的应用程序,则会出现ElementNotAvaiableException。因此线程不应完全死亡。