(摘要自:
http://blogs.msdn.com/gisenberg/archive/2008/07/12/ui-automation-in-silverlight-simulating-user-interactions.aspx)
在 Silverlight 中,UI 自动化(UIA)的相关内容在下列名称空间中:
System.Windows.Automation
System.Windows.Automation.Peers
System.Windows.Automation.Provider
要开放某个自定义控件为支持 UI 自动化的,则需要覆盖 OnCreateAutomationPeer 这个方法(定义在 Control 类中),来返回一个与该控件对应的 AutomationPeer 子类,实质是一个面向 COM 的 wrapper,用来描述和操作目标控件的一些信息,以及设值/取值等操作(用于模拟键盘输入)。
那么,这样做了之后,就可以在 UI Test 的代码里通过自动化的接口,来取得这个 wrapper 对象,并进行相应的自动化测试。
可以用 Windows SDK 里的一个工具 UISpy.exe 来查看 UI 结构信息(http://blogs.msdn.com/windowssdk/archive/2008/02/18/where-is-uispy-exe.aspx)
相关一些代码摘录如下:
测试代码:
1.
2.
over.
在 Silverlight 中,UI 自动化(UIA)的相关内容在下列名称空间中:
System.Windows.Automation
System.Windows.Automation.Peers
System.Windows.Automation.Provider
要开放某个自定义控件为支持 UI 自动化的,则需要覆盖 OnCreateAutomationPeer 这个方法(定义在 Control 类中),来返回一个与该控件对应的 AutomationPeer 子类,实质是一个面向 COM 的 wrapper,用来描述和操作目标控件的一些信息,以及设值/取值等操作(用于模拟键盘输入)。
那么,这样做了之后,就可以在 UI Test 的代码里通过自动化的接口,来取得这个 wrapper 对象,并进行相应的自动化测试。
可以用 Windows SDK 里的一个工具 UISpy.exe 来查看 UI 结构信息(http://blogs.msdn.com/windowssdk/archive/2008/02/18/where-is-uispy-exe.aspx)
相关一些代码摘录如下:
public
partial
class
SearchBar : Control
{

public SearchBar()
{
this .GotFocus += (sender, args)
=>
{
this .SearchText.Focus();
};
InitializeComponent();
}
protected override AutomationPeer OnCreateAutomationPeer()
{
return new SearchBarAutomationPeer( this );
}
}
{

public SearchBar()
{
this .GotFocus += (sender, args)
=>
{
this .SearchText.Focus();
};
InitializeComponent();
}
protected override AutomationPeer OnCreateAutomationPeer()
{
return new SearchBarAutomationPeer( this );
}
}
public
class
SearchBarAutomationPeer : FrameworkElementAutomationPeer, IValueProvider
{
public SearchBarAutomationPeer(SearchBar searchBar) : base (searchBar)
{
}
protected override string GetAutomationIdCore()
{
return " SearchBar " ; // You're going to want to make this unique. ;)
}
protected override string GetClassNameCore()
{
return " SearchBar " ;
}
protected override bool IsKeyboardFocusableCore()
{
return true ;
}
public SearchBar SearchBar
{
get
{
return (SearchBar) base .Owner;
}
}
#region IValueProvider Members
public bool IsReadOnly
{
get
{
return this .SearchBar.SearchText.IsReadOnly;
}
}
public void SetValue( string value)
{
this .SearchBar.SearchText.Text = value;
}
public string Value
{
get
{
return this .SearchBar.SearchText.Text;
}
}
#endregion
{
public SearchBarAutomationPeer(SearchBar searchBar) : base (searchBar)
{
}
protected override string GetAutomationIdCore()
{
return " SearchBar " ; // You're going to want to make this unique. ;)
}
protected override string GetClassNameCore()
{
return " SearchBar " ;
}
protected override bool IsKeyboardFocusableCore()
{
return true ;
}
public SearchBar SearchBar
{
get
{
return (SearchBar) base .Owner;
}
}
#region IValueProvider Members
public bool IsReadOnly
{
get
{
return this .SearchBar.SearchText.IsReadOnly;
}
}
public void SetValue( string value)
{
this .SearchBar.SearchText.Text = value;
}
public string Value
{
get
{
return this .SearchBar.SearchText.Text;
}
}
#endregion
测试代码:
1.
[TestMethod]
public void TestMethod1()
{
Process process = System.Diagnostics.Process.GetProcessesByName( " iexplore " ).First();
AutomationElement browserInstance = System.Windows.Automation.AutomationElement.FromHandle(process.MainWindowHandle);
TreeWalker tw = new TreeWalker( new PropertyCondition(AutomationElement.ClassNameProperty, " SearchBar " ));
AutomationElement searchBar = tw.GetFirstChild(browserInstance);
myElement.SetFocus();
Thread.Sleep( 1000 );
searchBar.SetFocus();
Thread.Sleep( 1000 );
SendKeys.SendWait( " Hello, world! " );
}
public void TestMethod1()
{
Process process = System.Diagnostics.Process.GetProcessesByName( " iexplore " ).First();
AutomationElement browserInstance = System.Windows.Automation.AutomationElement.FromHandle(process.MainWindowHandle);
TreeWalker tw = new TreeWalker( new PropertyCondition(AutomationElement.ClassNameProperty, " SearchBar " ));
AutomationElement searchBar = tw.GetFirstChild(browserInstance);
myElement.SetFocus();
Thread.Sleep( 1000 );
searchBar.SetFocus();
Thread.Sleep( 1000 );
SendKeys.SendWait( " Hello, world! " );
}
2.
[TestMethod]
public void TestMethod1()
{
Process process = System.Diagnostics.Process.GetProcessesByName( " iexplore " ).First();
AutomationElement myElement = System.Windows.Automation.AutomationElement.FromHandle(process.MainWindowHandle);
TreeWalker tw = new TreeWalker( new PropertyCondition(AutomationElement.ClassNameProperty, " SearchBar " ));
AutomationElement searchBar = tw.GetFirstChild(myElement);
object valuePattern;
searchBar.TryGetCurrentPattern(ValuePattern.Pattern, out valuePattern);
((ValuePattern)valuePattern).SetValue( " Hello, world! " );
}
public void TestMethod1()
{
Process process = System.Diagnostics.Process.GetProcessesByName( " iexplore " ).First();
AutomationElement myElement = System.Windows.Automation.AutomationElement.FromHandle(process.MainWindowHandle);
TreeWalker tw = new TreeWalker( new PropertyCondition(AutomationElement.ClassNameProperty, " SearchBar " ));
AutomationElement searchBar = tw.GetFirstChild(myElement);
object valuePattern;
searchBar.TryGetCurrentPattern(ValuePattern.Pattern, out valuePattern);
((ValuePattern)valuePattern).SetValue( " Hello, world! " );
}
over.