如何用Appium測試控件
DevExpress WPF控件支持Appium框架與WinAppDriver UI測試自動化。本主題展示了如何準備環(huán)境和創(chuàng)建測試。
準備環(huán)境
按照以下步驟使用Appium與DevExpress WPF控件:
- 啟用Windows開發(fā)人員模式。
- 安裝winappdriver。
- 在您的項目中引用Appium.WebDriver nuget package。
-
將DevExpress WPF控件切換到UI測試模式。要做到這一點,請設(shè)置DX.UITESTINGENABLED 環(huán)境變量為1,或者ClearAutomationEventsHelper.UITestingEnabled屬性在被測試的應(yīng)用程序啟動時為true。這種模式導(dǎo)致以下變化:
- 動畫被禁用。
- 上下文菜單僅在鼠標單擊時打開,當(dāng)鼠標指針位于菜單上方時不打開。
- UI Automation tree經(jīng)過調(diào)整,使UI測試更加穩(wěn)定和可靠。
提示:示例項目使用EnvironmentVariables 屬性來指定DX.UITESTINGENABLED環(huán)境變量。
View Example :Test the OutlookInspiredApp with Appium
創(chuàng)建測試
要使用Appium API,請創(chuàng)建一個WindowsDriver實例。下面的代碼示例運行測試過的應(yīng)用程序并創(chuàng)建一個WindowsDriver會話:
UnitTest1.cs:
var options = new AppiumOptions(); options.AddAdditionalCapability(capabilityName: "app", capabilityValue: PathToTheApp); options.AddAdditionalCapability(capabilityName: "deviceName", capabilityValue: "WindowsPC"); options.AddAdditionalCapability(capabilityName: "platformName", capabilityValue: "Windows"); options.AddAdditionalCapability(capabilityName: "ms:experimental-webdriver", capabilityValue: true); var driver = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), options);
點擊復(fù)制
UnitTest1.vb:
Dim options = New AppiumOptions() options.AddAdditionalCapability(capabilityName:="app", capabilityValue:=PathToTheApp) options.AddAdditionalCapability(capabilityName:="deviceName", capabilityValue:="WindowsPC") options.AddAdditionalCapability(capabilityName:="platformName", capabilityValue:="Windows") options.AddAdditionalCapability(capabilityName:="ms:experimental-webdriver", capabilityValue:=True) Dim driver = New WindowsDriver(Of WindowsElement)(New Uri("http://127.0.0.1:4723"), options)
點擊復(fù)制
要測試一個正在運行的應(yīng)用程序,將上面代碼示例中的" app " capacityname行更改為以下內(nèi)容:
UnitTest1.cs :
options.AddAdditionalCapability(capabilityName: "appTopLevelWindow", capabilityValue: $"0x{WindowHandle.ToInt64():X8}");
點擊復(fù)制
UnitTest1.vb:
options.AddAdditionalCapability(capabilityName:="appTopLevelWindow", capabilityValue:=$"0x{WindowHandle.ToInt64()}")
點擊復(fù)制
提示:如果您在與被測試應(yīng)用程序相同的進程中托管測試,則測試應(yīng)該在單獨的線程中。在這種情況下,UI線程可以同步處理windows消息。
使用 WinAppDriver UI recorder
您可以使用WinAppDriver UI recorder工具來生成測試,在這種情況下,測試應(yīng)用程序需要 DesktopSession 類。這種方法有以下缺點:
- 這些測試使用FindElementByXPath方法來查找元素,這個方法比較慢,因為它要解析整個可視樹。
- 這些測試很難維護,因為它們使用絕對xpath來查找元素,應(yīng)用程序布局的改變可能會破壞測試。
- 這些試題很難讀懂,參考我們的GitHub存儲庫上的提交,比較記錄的測試和基于Appium api的測試可讀性。
使用 Appium API
使用WinAppDriver的FindElementByName、FindElementByClassName和FindElementByAccessibilityId方法來查找應(yīng)用程序元素。這些方法的工作速度比FindElementByXPath方法快,修改應(yīng)用程序布局時,基于這些方法的測試不會失敗。
您可以使用檢查工具來查找元素名、類名和自動化 ids。
提示:您可以指定應(yīng)用程序元素的AutomationProperties.AutomationId 附加屬性來增強測試的可讀性。
示例
下面的代碼打開“New Employee”窗口,找到帶有TextEdit類的“First Name”元素,輸入“John”,然后點擊“Save & Close”元素:
C#:
[Test] public void CreateEmployee() { var bNewEmployee = driver.FindElementByName("New Employee"); bNewEmployee.Click(); WindowsElement newEmployeeWindow = null; while (newEmployeeWindow == null) newEmployeeWindow = driver.FindElementByName("Employee (New)"); newEmployeeWindow.FindElementByName("First Name").FindElementByClassName("TextEdit").SendKeys("John"); newEmployeeWindow.FindElementByName("Save & Close").Click(); }
點擊復(fù)制
Visual Basic:
Public Sub CreateEmployee() Dim driver = desktopSession.DesktopSessionElement Dim bNewEmployee = driver.FindElementByName("New Employee") bNewEmployee.Click() Dim newEmployeeWindow As WindowsElement = Nothing While newEmployeeWindow Is Nothing newEmployeeWindow = driver.FindElementByName("Employee (New)") End While newEmployeeWindow.FindElementByName("First Name").FindElementByClassName("TextEdit").SendKeys("John") newEmployeeWindow.FindElementByName("Save & Close").Click() End Sub
點擊復(fù)制
View Example:Test theOutlookInspiredApp with Appium