我正在为应用程序进行手动编码的编码UI测试。
该应用程序具有在2个窗口中运行的特定功能。单击一个按钮时,会出现一个新窗口,然后用户选择该窗口关闭,然后用户继续在主窗口上执行操作。
使用Selenium,我会通过遍历所有窗口句柄并通过使用“ driver.SwitchTo()。窗口(句柄)将页面的URL传递给我来处理它。 “ 方法。但是,使用Coded UI,我还没有找到类似的解决方案。使用Process类我可以做类似的工作:
Process[] myList = Process.GetProcessesByName("iexplore");
foreach (Process item in myList)
if (item.MainWindowTitle.Contains("Window Title"))
{
item.Kill();
}
问题是我正在测试的应用程序设计很差,整个应用程序中的所有窗口都具有相同的名称,因此它不起作用。
是否有一种方法可用于切换到Coded UI上的其他窗口?或者最好的方法是什么?
答案 0 :(得分:2)
看看这个问题,它可能会有所帮助:Interacting with multiple instances of an application in Coded UI
你没有在CUIT中进行“切换”,每个窗口和控件都是通过UITestControl对象访问的。如果你想在其他窗口上做东西,你可以为它创建一个新对象。如果您无法使用搜索属性区分这两个窗口,则可以使用Instance
属性或FindMatchingControls
方法。
要捕捉窗口创建事件,您可以使用winhook。它为您提供了创建的每个窗口的窗口句柄。使用它可以查看创建的窗口是否是您正在等待的窗口,然后使用UITestControlFactory.FromWindowHandle
创建一个UITestControl以供CUIT进行交互。如果你有一个为该窗口生成的类,你可以创建该类的实例并调用它的CopyFrom
方法将你从窗口句柄创建的控件传递给它。
答案 1 :(得分:1)
我正在使用:
public static HtmlDocument WaitForPopup(string popupName, string text)
{
BrowserWindow browser = new BrowserWindow();
browser.SearchProperties.Add(BrowserWindow.PropertyNames.Name, popupName,
PropertyExpressionOperator.Contains);
browser.WindowTitles.Add(popupName);
browser.WaitForControlExist();
browser.WaitForControlReady();
browser.SetFocus();
HtmlDocument html = new HtmlDocument(browser);
html.SearchProperties.Add(HtmlDocument.PropertyNames.InnerText, text,
PropertyExpressionOperator.Contains);
html.WaitForControlExist();
html.WaitForControlReady();
Playback.Wait(1000);
return html;
}
只需调用WaitForPopup("您的窗口名称","窗口中的一些常量文本")并继续测试。 请注意,此方法将返回新窗口的html,您可以进一步使用它。