我试图使用WinAppDriver、Appium和C#在一个古老的Delphi5应用程序上实现一些UI自动化。它启动应用程序,有一个小飞溅屏幕,然后是一个窗口模式框登录。用户名已经填写完毕,所以只需键入密码并按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和Appum3.0.0.2,Visual、WinAppDriver和Inspect.exe作为管理员运行。
检查显示登录屏幕和启动屏幕作为单独的屏幕,这些屏幕在树中没有连接。
登录后的页面源是:
<?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来说太老了吗?我该放弃吗?

发布于 2018-03-20 16:30:15
这不是最好的选择,但我认为您可以使用sendkey来访问OK按钮。像Session.Keyboard.SendKeys(Keys.Alt + "o“+Keys.Alt)一样;因为访问键是Alt+o。
发布于 2020-01-30 12:25:32
您可以使用下面的代码片段来处理启动屏幕和任何类型的桌面窗口(例如,如果您有两个窗口并希望切换)
var currentWindowHandle = driver.CurrentWindowHandle;
Thread.Sleep(TimeSpan.FromSeconds(5));
var allWindowHandles = driver.WindowHandles;
driver.SwitchTo().Window(allWindowHandles[0]);发布于 2020-06-17 14:21:00
我在Actions类方面的成功要比使用.Click()中的webdrivers与WindowElement对象进行交互要成功得多。
此外,使用多个属性进行XPath搜索以确定对象的效果要好得多,至少对我来说是这样。
因此,根据我过去几年在WinAppDriver工作的经验,我会尝试:
新Actions(Session).Click(Session.FindElementByXPath("//*@Name='OK‘和@ClassName='TWAOkButton'")).Build().Perform();
https://stackoverflow.com/questions/49373799
复制相似问题