5年前、私のテストでそのような要素の数が多くなりすぎ、コントロールがより複雑になり、UIテスト用のライブラリがキノコのように成長し始めました。
必要なXPathを見つけるルーチンを喜びに変えることにしました。
最初はVisual Studio UIMap Editorを使用しました。アプリケーションが複雑であればあるほど、速度とロケーターの置換という点で私には不向きでした。 UIAutomationとそのラッパー(TestStack.White、Cuite、Microsoft UITestなど)に関する別の記事で理由を説明します。
だから挑戦
簡単なPageObjectのエディターを作成します。 ヘルパーツール:UIAVerify。
一般原則
- デスクトップの各コントロールには検索プロパティがあり、子要素を含めることができます
- コントロールは要素(要素)にグループ化され、要素は名前空間(アセンブリ)にグループ化されます
- カプセル化、継承、ポリモーフィズム
- 既製のカードを使用する機能。 たとえば、DevExpress、AvalonDock、OpenFileDialogなどの既成のマップと拡張機能があります。 プロジェクト間で転送します
どうした
Windows 10計算機で追加の例を使用する:
- 「電卓」ウィンドウのマップを作成しています。このため、デスクトップツリーのマップエディターで、ワンクリックですべてのウィンドウオブジェクトを転送し、余分なものを削除します。 ロケーターは自動的に添付されます。 要素を手動で追加できます(たとえば、Seleniumの場合)、空想の飛行は無制限です
- 生成された要素名を確認します。 気に入らない場合は、手動で名前を変更します
- UIAutomationラッパーのマップを保存します(通常のXML => C#コンバーター。任意のラッパーを使用できます、Selenium、MS UITest、TestStack.White)
すべての時間:3分
右側には、UIAVerifyデスクトップツリーの類似物があります。 左:地図

結果
4ファイルがバージョン管理下で送信されます。
XMLでマップする
<?xml version="1.0" encoding="utf-8"?> <Map Version="2.0.0.0" Uid="7b797972-8c3c-4dbf-9c30-7cc8ae14afda"> <Assembly Name="Calc" FrameWork="NavyWindows"> <Assembly Name="Map" FrameWork="NavyWindows"> <Element ControlType="Window" Name="" Comment="Window """> <Control Comment="Window "TitleBar"" IsHidden="true" Name="" ControlType="Window"> <Property Name="Name"></Property> <Control Comment="Button "Close"" Name="" ControlType="Button"> <Property Name="AutomationId">Close</Property> </Control> ... </Map>
形成されたラッパーカードUIAutomation
namespace Calc { public partial class UIWindow : UIWindow { public UIWindow(UIControl control) { Wrap(control); } public UIWindow() { } public static UIWindow Instance { get { return Desktop.Instance.Get<UIWindow>(XPath); } } public static By XPath { get { return By.Xpath("Name="); } } /// <summary> /// Button "plusButton" /// </summary> public UIButton UIButton { get { return Get<UIButton>(By.Xpath(@"AutomationId=plusButton")); } } ... </Map>
MapExt.csおよびさまざまな拡張機能
namespace Calc { public static class UIWindowExt { public static int Result(this UIWindow window) { var textValue = window.UIResultText.Text .Replace(" ", "") .Replace(" ", ""); return int.Parse(textValue); } } }
CalculationTests.csテスト
using Microsoft.VisualStudio.TestTools.UnitTesting; using Calc; using System.Diagnostics; using System; namespace CalcTests { [TestClass] public class CalculationTests : IDisposable { public CalculationTests() { _process = Process.Start("calc.exe"); _calc = UIWindow.Instance; } [TestMethod] public void Sum() { _calc.UIButton.Click(); _calc.UIButton.Click(); _calc.UIButton.Click(); _calc.UIButton.Click(); Assert.AreEqual(6, _calc.Result(), " "); } public UIWindow _calc { get; set; } Process _process; public void Dispose() { _calc.Close(); } } }
コメントには、すでに多くの代替ソリューション、リンクのリンク、より成功した例があると思います。
ご清聴ありがとうございました!