开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 8125|回复: 0

[DevExpress Winforms使用技巧]UI自动化

[复制链接]

0

精华

8

贡献

1768

赞扬

特约版主

帖子
583
软币
4524
在线时间
275 小时
注册时间
2019-2-21
发表于 2019-12-9 10:53:27 | 显示全部楼层 |阅读模式
本帖最后由 AABBbaby 于 2019-12-9 10:56 编辑

在针对Visual Studio 2019的发行说明中,Microsoft 宣布Coded UI测试的生命周期终止。

Microsoft建议将Appium with WinAppDriver 一起用于测试桌面和UWP应用,此消息引起广大用户的兴趣:DevExpress控件是否与Appium兼容?经过DevExpress团队的反复测试,答案是肯定的!使用Appium创建自动UI测试的方法如下。

1. 跳转到 https://github.com/Microsoft/WinAppDriver/releases然后下载两个APP,

  • WinAppDriver - 允许您运行测试,需要安装。
  • WinAppDriver UI Recorder - 允许您在运行时记录测试,不需要安装 - 将下载的存档解压到任何文件夹。

2. 在Windows中打开Developer Mode

3. 以管理员身份运行WinAppDriver.exe并使其运行,请注意应用程序正在侦听的地址,稍后您将需要它。


4. 打开您要测试的Visual Studio解决方案,或创建一个新的示例解决方案。

5. 将新的单元测试项目添加到解决方案。


6. 在Solution Explorer中右键单击Unit Test project,然后选择“Manage NuGet Packages…”,安装最新的稳定Appium.WebDriver程序包。

7. 打开Unit Test项目的UnitTest1.cs文件,并添加两个类:MainDemoSession(定义开始和结束测试会话的方法)和Helper(包含查找被测试的UI元素的方法),将步骤3中的地址用作WindowsApplicationDriverUrl值。

[C#] 纯文本查看 复制代码
public class MainDemoSession
{
protected const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723";
private const string ApplicationPath = @"C:\Users\...\AppiumTest.exe";

protected static WindowsDriver<WindowsElement> desktopSession;

public static void Setup(TestContext context)
{
// Launch a new instance of the tested application
if (desktopSession == null)
{
// Create a new session to launch the tested application

AppiumOptions options = new AppiumOptions();
options.AddAdditionalCapability("app", ApplicationPath);
desktopSession = new WindowsDriver<WindowsElement>(
new Uri(WindowsApplicationDriverUrl), options);
Assert.IsNotNull(desktopSession);
Assert.IsNotNull(desktopSession.SessionId);

// Set implicit timeout to 1.5 seconds
//to make element search to retry every 500 ms
//for at most three times
desktopSession.Manage().Timeouts().ImplicitWait =
TimeSpan.FromSeconds(1.5);
}
}

public static void TearDown()
{
// Close the application and delete the session
if (desktopSession != null)
{
desktopSession.Close();
desktopSession.Quit();
desktopSession = null;
}
}
}

public static class Helper
{
public static WindowsElement FindElementByAbsoluteXPath(
this WindowsDriver<WindowsElement> desktopSession,
string xPath,
int nTryCount = 3)
{
WindowsElement uiTarget = null;
while (nTryCount-- > 0) {
try {
uiTarget = desktopSession.FindElementByXPath(xPath);
}
catch {
}
if (uiTarget != null) {
break;
}
else {
System.Threading.Thread.Sleep(400);
}
}
return uiTarget;
}
}

8. 修改自动生成的UnitTest1类,如下所示:

[C#] 纯文本查看 复制代码
[TestClass]
public class UnitTest1 : MainDemoSession
{
[TestMethod]
public void TestMethod1()
{
//test start

//test finish
}
[ClassInitialize]
public static void ClassInitialize(TestContext context)
{
Setup(context);
}

[ClassCleanup]
public static void ClassCleanup()
{
TearDown();
}
}

9. 运行您的应用程序,并将其拖到主系统显示屏上(如果您具有多屏幕设置)。

10. 启动WinAppDriver UI Recorder然后点击“Record”, 将鼠标悬停在要与之交互的第一个UI元素上,然后等待它开始闪烁蓝色。Recorder的状态栏会将其文本从“Active”更改为“XPath Ready”。


11. 当该元素闪烁时,recorder已准备就绪,您可以执行UI操作:单击此元素、将其拖动、输入新值等。完成此元素后,将鼠标悬停在另一个UI元素上,等待 recorder的确认并重复该过程。

12. 记录了要重现的一系列步骤后,请在recorder中单击“Pause”,您可以打开actions selector确保已记录所有UI操作。


13. 单击“Generate and copy C# code to Clipboard”按钮来复制所有记录的操作代码,将此代码粘贴到UnitTest1.TestMethod1方法中。 例如,下面的代码选择“Job”标签。


[C#] 纯文本查看 复制代码
[TestMethod]
public void TestMethod1()
{
//test start
// LeftClick on TabItem "Job" at (20,31)
Console.WriteLine("LeftClick on TabItem \"Job\" at (20,31)");
string xpath_LeftClickTabItemJob_20_31 = "/Pane\[@ClassName=\"#32769\"\][@Name=\"Desktop 1\"]/Window\[starts-with(@AutomationId,\"XtraForm\")]/Pane[@Name=\"The XtraLayoutControl\"\][starts-with(@AutomationId,\"dataLayoutControl\")]/Table[@Name=\"Root\"]/Table[@Name=\"autoGeneratedGroup0\"]/Table[@Name=\"Root\"]/Table[@Name=\"Photo\"]/Table[@Name=\"FirstAndLastName\"]/Tab[@Name=\"Tabs\"]/TabItem[@Name=\"Job\"]";
var winElem_LeftClickTabItemJob_20_31 = desktopSession.FindElementByAbsoluteXPath(xpath_LeftClickTabItemJob_20_31);
if (winElem_LeftClickTabItemJob_20_31 != null)
{
winElem_LeftClickTabItemJob_20_31.Click();
}
else
{
Console.WriteLine($"Failed to find element using xpath: {xpath_LeftClickTabItemJob_20_31}");
return;
}
//test finish
}

14. 在内部测试期间,自动生成的代码可能无法通过其完整路径找到UI元素:

/Pane\[@ClassName=\"#32769\"\][@Name=\"Desktop 1\"]/Window[starts-with…

如果发生这种情况,请缩短所有元素路径,使其以“ / Window”开头。

string xpath_LeftClickTabItemJob_20_31 = "/Window[starts-with(@AutomationId...";

此外,您可以使用Assert.Fail而不是Console.WriteLine来调试测试(如果找不到UI元素,则可以)。

Assert.Fail($"Failed to find element...");

15. 在Visual Studio中右键单击Unit Test project,然后单击“Run Tests”。测试将启动您的应用程序,重复所有记录的步骤,然后关闭应用程序。 所有测试操作都记录在步骤3中启动的WinAppDriver控制台中。


您可以通过与Coded UI相同的方式启动Appium测试,唯一的区别是您需要在测试执行计算机上运行WinAppDriver。


DevExpress v19.2全新发布,最新动态请持续关注DevExpress中文网!

DevExpress中文网官网QQ群:540330292      欢迎一起进群讨论

回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-12-22 15:26

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表