我的一般设置:我们编写了一个带有小gui的excel导入器,允许非程序员使用"Button.Click"等命令编写和执行gui-tests.底层框架是TestStack.White.在导入excel文件和一些其他用户交互之后,测试在System.ComponentModel.BackgroundWorker内启动,只要我不查看(或甚至与包含大量childelements的元素交互),它就可以正常工作.
但是,只要我与TestStack.White.UIItems.WindowItems.Window或具有大量元素的TestStack.White.UIItems.UIItemContainer进行交互,testexecution就会结束.
通过交互,我的意思是从简单的东西,如非空检查或分配到局部变量或类似要求它的子计数.结束测试的一些例子: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
}
Run Code Online (Sandbox Code Playgroud)
2)
UIItemContainer pointOfInterest = theElement; //everything after this line does not happen
Run Code Online (Sandbox Code Playgroud)
3)
System.Diagnostics.Debug.WriteLine("AmountOfElements: " + UIAnchor.Items.Count); //the output doesn't come. everything after this line does not happen
Run Code Online (Sandbox Code Playgroud)
在没有数百个元素的窗口中,所有三个示例都按预期工作.
我的意思是很多元素,例如一个内部有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). …
Run Code Online (Sandbox Code Playgroud) 我按顺序调用了以下两种方法(顺序使用适当的类级别字段)
public const string ProcessName = "This is"
public const string WindowTitle = "somewhat proprietary."
public Application App { get; set; }
public void Launch()
{
var theProcess = Process.GetProcesses().First(p => p.ProcessName.Contains(ProcessName))
App = Application.Attach(theProcess);
}
public void Select()
{
var window = App.GetWindow(WindowTitle);
var textBox = window.Get<TextBox>();
//etc, do more stuff in the window
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,调用App.GetWindow()
需要很长时间.喜欢超过一分钟.应用程序和窗口都是打开和运行的.
我已经尝试过重载,GetWindow()
并尝试调用Application.GetWindows()
和Application.Find()
,但结果相同.
有没有人想过如何减少这个时间,或者至少确定需要这么长时间?我没有嫁给我的实施任何延伸 - 无论是什么让我的窗口对象对我来说都没问题.
更新:
为了解决迄今为止的评论,我修改了代码以尽量消除其他许多问题.
public void Select()
{
var processes = Process.GetProcesses().ToList();
var …
Run Code Online (Sandbox Code Playgroud) 我们有Jenkins的主从配置.我们的.NET项目是由在Windows上运行的从属Jenkins实例构建的.
有一堆GUI测试,但是如果打开了远程桌面连接(RDC)会话,它们似乎只会运行.
当尝试在没有RDC的情况下运行测试时,Jenkins没有在测试中显示任何进展.然而,然后,我连接到Slave的桌面,可以看到启动的应用程序的主窗口,但UI测试框架(白色)无法执行任何操作.
Jenkins slave通过Java Web Start启动.
我在几个网站上看到,遗憾的是,没有RDC会话就无法运行GUI测试.
我只想确认这是真的,并想知道是否有任何解决方法.
我正在寻找一个自动UI测试框架/软件工具.在过去,我一直在使用TestComplete,虽然它是一个很好的软件,但GUI测试自动化的概念被认为是足够困难,我写了一些帖子来抱怨 它.
第三方测试自动化工具的一个问题是,您必须学习新语言才能提高工作效率,更不用说工具支持很差.我现在正计划研究.Net 3.0和White Framework附带的Microsoft UI Automation.但在我这样做之前,我想知道那里的结果是什么.
有没有经验可以分享?您是否在应用程序中使用UI自动化创建了可持续且成功的测试套件?
编辑:这似乎是一个非常难的问题.如果我在这几天内没有收到任何答案,我会为此设置赏金.
首先,基本上我相信我只是需要帮助来弄清楚如何计算它,数学并不是我的强项.
仅供参考,MS-Word很可能与解决我的问题无关,我基本上只是提及它,因此你知道我所处的背景,但我相信它对于那些不了解MS-Word的人也应该是可以解决的.
我有一个Word有属性的问题,VerticalPercentScrolled
这是一个integer
.
这并不像我需要的那样准确,考虑一个300页的Word文档,滚动条只能有integer
0到100(百分比),所以例如,300页文档的25%是一个相当大的范围.
我已经离开并在UI Automation
库的帮助下读取了正确的值- TestStack.White - 如果发生了一些不需要的滚动,可以成功地将其设置为旧值.
像这样:
var hWnd = (IntPtr)WordUtils.GetHwnd();
var processId = Process.GetCurrentProcess().Id;
var uiApp = TestStack.White.Application.Attach((int)processId);
var uiWindow = uiApp.GetWindow(WindowHandling.GetWindowText(hWnd), InitializeOption.NoCache);
var wf = (IUIItemContainer)uiWindow.Get(SearchCriteria.ByClassName("_WwF"));
var wbs= wf.GetMultiple(SearchCriteria.ByClassName("_WwB"));
if (wbs.Length != 1)
return;
var wb= (IUIItemContainer)wbs.First();
var wgs = wb.GetMultiple(SearchCriteria.ByClassName("_WwG"));
if (wgs.Length != 1)
return;
var wg = wgs.First();
var element = wg.AutomationElement;
var oldVerticalPercent = (double)element.GetCurrentPropertyValue(ScrollPattern.VerticalScrollPercentProperty);
Run Code Online (Sandbox Code Playgroud)
使用此代码,我得到一个百分比值,让我们说9.442248572683356
而不是9
.
要重置值,请使用以下代码:
object scrollPattern;
if …
Run Code Online (Sandbox Code Playgroud) 这是我的问题.我有一个应用程序,它打开一个文件打开对话框,我试图在文件路径和文件名中输入"文件名:"组合框部分.
应用程序使用您登录的表单加载.这将打开另一个表单,其中有许多按钮.选择其中一个按钮可打开另一个表单.在这种形式中,有一个按钮来选择文件.在这个阶段,有3种形式开放.这将打开标准文件打开对话框.我似乎无法处理此文件打开对话框.
这是我正在使用的代码.
Window LoginForm = application.GetWindow("LoginForm");
LoginForm.Get<Button>("btnSelectFiles").Click(); // This is from the 3rd form that is opened
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我可以使用LoginForm变量访问其他表单中的所有按钮.我尝试了以下内容.
Window FileOpenDialog = application.GetWindow("Open", InitializeOption.NoCache);
Run Code Online (Sandbox Code Playgroud)
这不起作用.
我也试过以下但是这会返回null.我以为我可以使用LoginForm变量访问它.
Win32ComboBox comboBox = LoginForm.Get<Win32ComboBox>("Filename");
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?谢谢
我正在编写ac#代码来测试我的应用程序中的UI.我想从键盘发送ENTER.我已经检查过了TestStack.White.WindowsAPI.KeyboardInput.SpecialKeys
.它不包含任何方法发送ENTER.
谢谢.
我试图通过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