2016-03-02 35 views
0

我需要使用Visual Studio編碼的UI測試爲Delphi應用程序實現自動UI測試。我已經實現了我的Delphi-Contols的IAccessible接口。它工作正常,我從Control獲取AccessibleName。在實現UITestPropertyProvider之後,AccessibleName仍然不是有效的SearchProperty

然後我實現了視覺工作室的擴展。在這個擴展中,我有我自己的PropertyProvider-,ExtensionPackage-和WinControl-Class。

PropertyProvider:

namespace CUITExtension 
{ 
    public class AccessibleNamePropertyProvider : UITestPropertyProvider 
    {  
     private static Dictionary<string, UITestPropertyDescriptor> accessibleNamePropertyMap = null; 
     private static Dictionary<string, UITestPropertyDescriptor> AccessibleNamePropertyMap 
     { 
      get 
      { 
       if (accessibleNamePropertyMap == null) 
       { 
        UITestPropertyAttributes read = UITestPropertyAttributes.Readable 
         | UITestPropertyAttributes.DoNotGenerateProperties; 
        accessibleNamePropertyMap = new Dictionary<string, UITestPropertyDescriptor> 
          (StringComparer.OrdinalIgnoreCase); 
        accessibleNamePropertyMap.Add("AccessibleName", new UITestPropertyDescriptor(typeof(string), read)); 
       } 
       return accessibleNamePropertyMap; 
      } 
     } 

     public override UITestPropertyDescriptor GetPropertyDescriptor(UITestControl uiTestControl, string propertyName) 
     { 
      return AccessibleNamePropertyMap[propertyName]; 
     } 

     public override ICollection<string> GetPropertyNames(UITestControl uiTestControl) 
     { 
      if (uiTestControl.ControlType.NameEquals("Custom")) 
      { 
       // the keys of the property map are the collection of property names 
       return AccessibleNamePropertyMap.Keys; 
      } 
      throw new NotSupportedException(); 
     } 

     public override object GetPropertyValue(UITestControl uiTestControl, string propertyName) 
     { 
      if (String.Equals(propertyName, "AccessibleName", StringComparison.OrdinalIgnoreCase)) 
      { 
       object[] native = uiTestControl.NativeElement as object[]; 
       IAccessible acc = native[0] as IAccessible; 

       return acc.accName; 
      } 
      throw new NotSupportedException(); 
     } 

     public override int GetControlSupportLevel(UITestControl uiTestControl) 
     { 
      if (string.Equals(uiTestControl.TechnologyName, "MSAA", 
       StringComparison.OrdinalIgnoreCase) && 
       uiTestControl.ControlType.NameEquals("Custom")) 
      { 
       return (int)ControlSupport.ControlSpecificSupport; 
      } 

      // This is not my control, so return NoSupport 
      return (int)ControlSupport.NoSupport; 
     } 

     public override string[] GetPredefinedSearchProperties(Type specializedClass) 
     { 
      return null; 
     } 

     public override string GetPropertyForAction(UITestControl uiTestControl, UITestAction action) 
     { 
      return null; 
     } 

     public override string[] GetPropertyForControlState(UITestControl uiTestControl, ControlStates uiState, out bool[] stateValues) 
     { 
      stateValues = null; 
      return null; 
     } 

     public override Type GetPropertyNamesClassType(UITestControl uiTestControl) 
     { 
      if (uiTestControl.ControlType.NameEquals("Custom")) 
       return typeof(AccessibleControl.PropertyNames); 

      return null; 
     } 

     public override Type GetSpecializedClass(UITestControl uiTestControl) 
     { 
      if (uiTestControl.ControlType.NameEquals("Custom")) 
       return typeof(AccessibleControl); 

      return null; 
     } 

     public override void SetPropertyValue(UITestControl uiTestControl, string propertyName, object value) 
     { 
      return; 
     } 
    } 
} 

ExtensionPackage:

[assembly: Microsoft.VisualStudio.TestTools.UITest.Extension.UITestExtensionPackage(
       "AccessibleNameExtensionPackage", 
       typeof(CUITExtension.AccessibleNameExtensionPackage))] 
namespace CUITExtension 
{ 

    class AccessibleNameExtensionPackage : UITestExtensionPackage 
    { 
     public override string PackageDescription 
     { 
      get { return "Supports coded UI testing by using the AccessibleName"; } 
     } 

     public override string PackageName 
     { 
      get { return "AccessibleName Extension Package"; } 
     } 

     public override string PackageVendor 
     { 
      get { return "Microsoft (sample)"; } 
     } 

     public override Version PackageVersion 
     { 
      get { return new Version(1, 0); } 
     } 

     public override Version VSVersion 
     { 
      get { return new Version(14, 0); } 
     } 

     public override void Dispose() { } 

     public override object GetService(Type serviceType) 
     { 
      if (serviceType == typeof(UITestPropertyProvider)) 
      { 
       if (propertyProvider == null) 
       { 
        propertyProvider = new AccessibleNamePropertyProvider(); 
       } 
       return propertyProvider; 
      } 
      return null; 
     } 

     private UITestPropertyProvider propertyProvider = null; 
    } 
} 

WINCONTROL:

namespace CUITExtension 
{ 
    public class AccessibleControl : WinControl 
    { 
     public AccessibleControl(UITestControl c) : base(c) 
     { 
      TechnologyName = "MSAA"; 
      SearchProperties.Add(UITestControl.PropertyNames.ControlType, "Custom"); 
     } 

     public virtual string AccessibleName 
     { 
      get 
      { 
       return (string)GetProperty("AccessibleName"); 
      } 
     } 
    } 
} 

現在編碼的UI測試生成器被示出AccessibleName並且還產生AccessibleName作爲SearchProperty。

的UIMap:

public AccessibleControl UIItemCustom 
     { 
      get 
      { 
       if ((this.mUIItemCustom == null)) 
       { 
        this.mUIItemCustom = new AccessibleControl(this); 
        #region Search Criteria 
        this.mUIItemCustom.SearchProperties["AccessibleName"] = "UniqueName1"; 
        this.mUIItemCustom.SearchProperties[WinControl.PropertyNames.ClassName] = "TEdit"; 
        this.mUIItemCustom.WindowTitles.Add("Title"); 
        #endregion 
       } 
       return this.mUIItemCustom; 
      } 
     } 

*我已經在這裏改變了Searchproperties(僅適用於後,我沒有改變生成的代碼)

現在,當我開始測試,我得到的是說一個異常該AccessibleName不是有效的搜索屬性。我之前得到了這個例外,當時我還沒有實現擴展。但我認爲通過實現propertyprovider,AccessibleName應該是一個有效的搜索屬性。 我試圖調試它,但它似乎通過搜索控制它不使用propertyprovider,我不知道爲什麼?

我希望你能幫助我,如果你需要更多的信息請問。

Paul

回答

0

我得到了有效的searchproperty工作的問題。 我覆蓋了WinControl的GetValidSearchProperties方法。

protected override Dictionary<string, bool> GetValidSearchProperties() 
     { 
      Dictionary<string, bool> searchProperties = base.GetValidSearchProperties(); 
      if (!searchProperties.ContainsKey("AccessibleName")) 
       searchProperties.Add("AccessibleName", true); 
      return searchProperties; 
     } 
相關問題