找不到WinAppDriver元素

时间:2018-03-19 23:04:38

标签: c# appium winappdriver

我正在尝试使用WinAppDriver,Appium& C#在古老的Delphi 5应用程序上进行一些UI自动化。它启动应用程序,有一个小屏幕,然后是一个Windows模式框用于登录。用户名已经填写,所以只需输入密码,然后按确定按钮。

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来说太旧了吗?我应该放弃吗?enter image description here

3 个答案:

答案 0 :(得分:1)

这不是最佳选择,但我认为您可以使用sendkeys访问“确定”按钮。像Session.Keyboard.SendKeys(Keys.Alt +“o”+ Keys.Alt);由于访问键是Alt + o。 或者(IDK,如果这将起作用),您可以尝试使用accessibilityId“3741054”作为accessibilityId,如Session.FindElementByAccessibilityId(“3741054”);

答案 1 :(得分:0)

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

var currentWindowHandle = driver.CurrentWindowHandle;
    Thread.Sleep(TimeSpan.FromSeconds(5));
            var allWindowHandles = driver.WindowHandles;
    driver.SwitchTo().Window(allWindowHandles[0]);

答案 2 :(得分:-1)

与使用.Click()中烘焙的用于与WindowElement对象进行交互的webdriver相比,与Actions类相比,我取得了更大的成功。

而且,至少对我来说,通过XPath进行搜索时,使用多个属性来识别对象效果更好。

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

新操作(Session).Click(Session.FindElementByXPath(“ // * [@ Name ='OK'和@ ClassName ='TWAOkButton']”))。Build()。Perform();