C# 使用WinAppDriver,我需要有关如何在WPF应用程序中打开新窗口时更改焦点的帮助

C# 使用WinAppDriver,我需要有关如何在WPF应用程序中打开新窗口时更改焦点的帮助,c#,winappdriver,C#,Winappdriver,我需要有关如何在使用WinAppDriver在WPF应用程序中打开新窗口时更改焦点的帮助 使用WinAppDriver,我可以打开WPF应用程序并使用下面的代码进行测试, 我需要有关如何在WPF应用程序中打开新窗口时更改焦点的帮助。 WPF应用程序的问题是您无法使用标准方法,因为驱动程序无法识别该应用程序。应该有一种方法来帮助切换焦点,或者至少打开一个现有的WPS应用程序窗口,这是我现在无法做到的。如果有人能帮忙,我将不胜感激 // to open the standard app Appium

我需要有关如何在使用WinAppDriver在WPF应用程序中打开新窗口时更改焦点的帮助

使用WinAppDriver,我可以打开WPF应用程序并使用下面的代码进行测试, 我需要有关如何在WPF应用程序中打开新窗口时更改焦点的帮助。 WPF应用程序的问题是您无法使用标准方法,因为驱动程序无法识别该应用程序。应该有一种方法来帮助切换焦点,或者至少打开一个现有的WPS应用程序窗口,这是我现在无法做到的。如果有人能帮忙,我将不胜感激

// to open the standard app
AppiumOptions options2 = new AppiumOptions();
options2.AddAdditionalCapability("app", "Application new window");
options2.AddAdditionalCapability("Window", "WindowsPC");

//to open a WPS application
AppiumOptions options = new AppiumOptions();
options.AddAdditionalCapability("app", @"C:\Path\Debug\Application.exe");
options.AddAdditionalCapability("deviceName", "WindowsPC");
_driver = new WindowsDriver(new Uri("http://127.0.0.1:4723"), options);

{"desiredCapabilities":{"app":"[@Name =\"Loan Folder 14847\"]","Window":"WindowsPC","platformName":"Windows"},"capabilities":{"firstMatch":[{"platformName":"Windows"}]}}
HTTP/1.1 500 Internal Error
Content-Length: 101
Content-Type: application/json

{"status":13,"value":{"error":"unknown error","message":"The system cannot find the file specified"}}

我能够了解如何关注WPF应用程序中打开的新窗口,并希望发布我的解决方案以帮助以下人员:

//Setup
private WindowsDriver _driver;

AppiumOptions options = new AppiumOptions();
options.AddAdditionalCapability("app", @"C:\Desktop\Debug\application.exe");
options.AddAdditionalCapability("deviceName", "WindowsPC");

_driver = new WindowsDriver(new Uri("http://127.0.0.1:4723"), options);
_driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);

//Test
_driver.FindElementByAccessibilityId("Login").Click();
Thread.Sleep(5000);
_driver.FindElementByName("button").Click();
//Opens a new window
_driver.FindElementByName("Open").Click();
Thread.Sleep(2000);
//Solution - switches to the latest window
_driver.SwitchTo().Window(_driver.WindowHandles.First());
//can click on buttons in the new Window
_driver.FindElementByName("buttons").Click();
//Opens another new Window
_driver.FindElementByName("Open another window").Click();
Thread.Sleep(2000);
//Solution - switches to the latest window
_driver.SwitchTo().Window(_driver.WindowHandles.First());
//can click on buttons in the new Window
_driver.FindElementByName("button3").Click();

使用WindowHandles的另一种方法是通过WindowsElement API查找窗口元素。然后可以使用元素API查找窗口的子级

下面的示例打开一个新窗口,然后通过在新窗口上找到Close控件将其关闭

[测试]
公众利益
{
//通过菜单打开关于窗口
_session.FindElementByName(“帮助”)。单击();
_session.FindElementByName(“关于”)。单击();
//通过WindowElement API关闭子窗口
var aboutWindow=_session.FindElementByName(“aboutWindow”);
aboutWindow.FindElementByName(“关闭”)。单击();
}
您可以使用WinAPI

[DllImport("User32.dll")]
public static extern Int32 SetForegroundWindow(IntPtr hWnd); 
hWnd
是窗口的
NativeWindowHandle
属性

string windowHandle = windowElement.GetAttribute("NativeWindowHandle");
return new IntPtr(long.Parse(windowHandle));

您可能需要创建一个。除了代码之外,如果您能够快速解释问题的确切原因以及您是如何解决问题的,那么其他人就不需要同时查看这两个代码部分并试图找出问题所在,这会有所帮助differences@huserben,请参阅winappdriver github wiki上的部分。这就是OP的问题所在。Winappdriver在窗口句柄列表中保留单独的窗口。当焦点切换到另一个窗口时,需要手动切换到正确的窗口句柄。