【发布时间】:2019-01-07 15:07:20
【问题描述】:
这是通过nunit3.ConsoleRunner 进行的 Windows 10 UI 自动化测试。
这真的很奇怪,但是在我假期之前可以完美运行的相同代码现在挂起长达 2 小时或更长时间。我为我们的测试创建了自己的MenuClick() 方法,因为标准的MenuBar.MenuItem() 方法在导航过去的第二级菜单项时也经常挂起。正如我所说,我的方法在假期前效果很好。
不管怎样,现在Menu.SubMenu()调用经常需要2个小时甚至更长时间才能完成,这是不可接受的。
另外一点奇怪的是,测试代码成对地单击 3 级菜单项,它们都打开了浏览文件夹对话框。第一个选择源文件夹,另一个选择目标文件夹。 “挂起”仅在尝试获得第二级 submenu 以在第三级菜单项单击对中的第二个时发生(到目前为止)。
目前为了解决这个问题,我正在生成一个调用 menu = menuBar.MenuItem() 的新线程。在主线程中,我等待菜单为非空或超时发生,然后在检查之间进行 500 毫秒的睡眠。这至少可以让我重试。但是,出现这种情况时,整个被测应用程序中的其余菜单操作都挂起,因此我无法重试。似乎是 TestStack.White 菜单处理区域中的一个错误。
public static void GetSubMenu(object obj)
{
string[] menuNames = obj as string[];
menu = menuBar.MenuItem(menuNames);
}
private static MenuBar menuBar = null;
private static Menu menu = null;
public static int ClickMenu(MenuBar mainMenu, params string[] menuItems)
{
menuBar = mainMenu;
bool bDone = false;
menu = null;
System.Threading.Thread t = new System.Threading.Thread(GetSubMenu);
t.Start(menuItems);
System.Threading.Thread.Sleep(500);
DateTime timeOut = DateTime.Now + TimeSpan.FromSeconds(10);
while (menu == null && DateTime.Now < timeOut)
{
System.Threading.Thread.Sleep(500);
}
if (menu != null)
{
menu.Click();
bDone = true;
log.Info($"ClickMenu success");
}
t.Abort();
return bDone ? 1 : 2;
}
【问题讨论】:
-
你真的要设置 menu = menu.SubMenu(...)。或者你想要类似“var item = menu.SubMenu(...); ... item.Click();”的东西
-
嗨,StefanG。是的,从纯粹的最佳实践的角度来看,我应该使用 var。但这不会改变我的问题,不是吗?我可能遗漏了什么?
-
我的意思是您将 SubMenu 的结果设置为一个新变量。不知道 SubMenu() 的实现细节,但这可能是个问题。
-
SubMenu() 返回一个 Menu 对象,这就是我获取 Menu 对象结果并在其上调用 Click() 方法的原因。无论如何,大部分时间它几乎会立即返回,但如果没有,则最多需要 2 小时才能返回。
标签: c# nunit-3.0 nunit-console teststack