找不到 WinAppDriver 元素
WinAppDriver element not found
我正在尝试使用 WinAppDriver、Appium 和 C# 在古老的 Delphi 5 应用程序上执行一些 UI 自动化。它会启动应用程序,有一个小启动画面,然后是一个用于登录的 windows 模式框。用户名已经填好,所以只需输入密码并按 OK 按钮。
var appCapabilities = new DesiredCapabilities();
appCapabilities.SetCapability("app", @"C:\APP\APP1998.exe");
appCapabilities.SetCapability("deviceName", "WindowsPC");
Session = new WindowsDriver<WindowsElement>(new Uri(WindowsApplicationDriverUrl), appCapabilities);
Assert.IsNotNull(Session);
Assert.IsNotNull(Session.SessionId);
Assert.AreEqual("APP1998", Session.Title.ToUpper());
Session.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(15);
Session.Keyboard.SendKeys("PASSWORD1");
这些都失败了:
//The logon dialog OK button
Session.FindElementByName("OK").Click();
//The File menu
Session.FindElementByName("File").Click();
//The Exit command from the File menu
Session.FindElementByName("Exit").Click();
我正在使用 WinAppDriver 1.0 和 Appium 3.0.0.2 以及 Visual Studio、WinAppDriver 和 Inspect.exe 运行 作为管理员。
Inspect 将登录屏幕和初始屏幕显示为单独的屏幕,它们在树中没有连接。
您登录后的页面来源为:
<?xml version="1.0" encoding="utf-16"?><Window AcceleratorKey="" AccessKey="" AutomationId="" ClassName="TApplication" FrameworkId="Win32" HasKeyboardFocus="False" HelpText="" IsContentElement="True" IsControlElement="True" IsEnabled="True" IsKeyboardFocusable="True" IsOffscreen="True" IsPassword="False" IsRequiredForForm="False" ItemStatus="" ItemType="" LocalizedControlType="window" Name="Mop1998" Orientation="None" ProcessId="11084" RuntimeId="42.1578230" x="0" y="0" width="1" height="1" CanMaximize="False" CanMinimize="True" IsModal="False" WindowVisualState="Normal" WindowInteractionState="ReadyForUserInteraction" IsTopmost="False" CanRotate="False" CanResize="False" CanMove="False" IsAvailable="True" />
来自 webdriver 背景,我在那里看不到任何 ID - 难怪它找不到它们或者是我的误解。
这个应用程序对于 WinAppDriver 来说是否太旧了?我应该放弃吗?
这不是最佳选择,但我认为您可以使用发送键来访问“确定”按钮。像 Session.Keyboard.SendKeys(Keys.Alt + "o" + Keys.Alt);由于访问键是 Alt+o。
或者(IDK,如果这行得通的话)你可以尝试使用 accessibilityId "3741054" 作为 accessibilityId like Session.FindElementByAccessibilityId("3741054");
您可以使用下面的代码片段来处理启动画面和任何类型的 windows 桌面(比如如果您有两个 windows 并且想要切换)
var currentWindowHandle = driver.CurrentWindowHandle;
Thread.Sleep(TimeSpan.FromSeconds(5));
var allWindowHandles = driver.WindowHandles;
driver.SwitchTo().Window(allWindowHandles[0]);
我使用 Actions class 比使用 .Click() 中内置的网络驱动程序与 WindowElement 对象进行交互更成功。
此外,通过具有多个属性的 XPath 进行搜索以识别对象的效果要好得多,至少对我而言。
因此,根据我过去几年每天使用 WinAppDriver 的经验,我会尝试:
new Actions(Session).Click(Session.FindElementByXPath("//*[@Name='OK' and @ClassName='TWAOkButton']")).Build()。执行();
我正在尝试使用 WinAppDriver、Appium 和 C# 在古老的 Delphi 5 应用程序上执行一些 UI 自动化。它会启动应用程序,有一个小启动画面,然后是一个用于登录的 windows 模式框。用户名已经填好,所以只需输入密码并按 OK 按钮。
var appCapabilities = new DesiredCapabilities();
appCapabilities.SetCapability("app", @"C:\APP\APP1998.exe");
appCapabilities.SetCapability("deviceName", "WindowsPC");
Session = new WindowsDriver<WindowsElement>(new Uri(WindowsApplicationDriverUrl), appCapabilities);
Assert.IsNotNull(Session);
Assert.IsNotNull(Session.SessionId);
Assert.AreEqual("APP1998", Session.Title.ToUpper());
Session.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(15);
Session.Keyboard.SendKeys("PASSWORD1");
这些都失败了:
//The logon dialog OK button
Session.FindElementByName("OK").Click();
//The File menu
Session.FindElementByName("File").Click();
//The Exit command from the File menu
Session.FindElementByName("Exit").Click();
我正在使用 WinAppDriver 1.0 和 Appium 3.0.0.2 以及 Visual Studio、WinAppDriver 和 Inspect.exe 运行 作为管理员。
Inspect 将登录屏幕和初始屏幕显示为单独的屏幕,它们在树中没有连接。
您登录后的页面来源为:
<?xml version="1.0" encoding="utf-16"?><Window AcceleratorKey="" AccessKey="" AutomationId="" ClassName="TApplication" FrameworkId="Win32" HasKeyboardFocus="False" HelpText="" IsContentElement="True" IsControlElement="True" IsEnabled="True" IsKeyboardFocusable="True" IsOffscreen="True" IsPassword="False" IsRequiredForForm="False" ItemStatus="" ItemType="" LocalizedControlType="window" Name="Mop1998" Orientation="None" ProcessId="11084" RuntimeId="42.1578230" x="0" y="0" width="1" height="1" CanMaximize="False" CanMinimize="True" IsModal="False" WindowVisualState="Normal" WindowInteractionState="ReadyForUserInteraction" IsTopmost="False" CanRotate="False" CanResize="False" CanMove="False" IsAvailable="True" />
来自 webdriver 背景,我在那里看不到任何 ID - 难怪它找不到它们或者是我的误解。
这个应用程序对于 WinAppDriver 来说是否太旧了?我应该放弃吗?
这不是最佳选择,但我认为您可以使用发送键来访问“确定”按钮。像 Session.Keyboard.SendKeys(Keys.Alt + "o" + Keys.Alt);由于访问键是 Alt+o。 或者(IDK,如果这行得通的话)你可以尝试使用 accessibilityId "3741054" 作为 accessibilityId like Session.FindElementByAccessibilityId("3741054");
您可以使用下面的代码片段来处理启动画面和任何类型的 windows 桌面(比如如果您有两个 windows 并且想要切换)
var currentWindowHandle = driver.CurrentWindowHandle;
Thread.Sleep(TimeSpan.FromSeconds(5));
var allWindowHandles = driver.WindowHandles;
driver.SwitchTo().Window(allWindowHandles[0]);
我使用 Actions class 比使用 .Click() 中内置的网络驱动程序与 WindowElement 对象进行交互更成功。
此外,通过具有多个属性的 XPath 进行搜索以识别对象的效果要好得多,至少对我而言。
因此,根据我过去几年每天使用 WinAppDriver 的经验,我会尝试:
new Actions(Session).Click(Session.FindElementByXPath("//*[@Name='OK' and @ClassName='TWAOkButton']")).Build()。执行();