0

我正在尝试使用 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 来说是否太旧了?我应该放弃吗?在此处输入图像描述

4

3 回答 3

1

这不是最好的选择,但我认为您可以使用 sendkeys 访问 OK 按钮。像 Session.Keyboard.SendKeys(Keys.Alt + "o" + Keys.Alt); 因为访问键是 Alt+o。或者(如果这可行的话,IDK)你可以尝试使用accessibilityId“3741054”作为一个accessibilityId,比如Session.FindElementByAccessibilityId("3741054");

于 2018-03-20T16:30:15.147 回答
0

您可以使用下面的代码片段来处理启动画面和任何类型的桌面窗口(例如,如果您有两个窗口并且想要切换)

var currentWindowHandle = driver.CurrentWindowHandle;
    Thread.Sleep(TimeSpan.FromSeconds(5));
            var allWindowHandles = driver.WindowHandles;
    driver.SwitchTo().Window(allWindowHandles[0]);
于 2020-01-30T12:25:32.530 回答
0

与使用 .Click() 中烘焙的 webdrivers 与 WindowElement 对象交互相比,我在 Actions 类方面取得了更大的成功。

此外,通过 XPath 搜索具有多个属性来识别对象的效果要好得多,至少对我来说是这样。

因此,根据我过去几年每天使用 WinAppDriver 的经验,我会尝试:

new Actions(Session).Click(Session.FindElementByXPath("//*[@Name='OK' and @ClassName='TWAOkButton']")).Build().Perform();

于 2020-06-17T14:21:00.963 回答