说明:程序中有些自定义的控件类型在TestStack.White框架中没有涉及,需要引入自定义的DLL,通过鼠标点击事件处理
使用:将自定义的ClassLibrary2.dll拷贝到项目/bin/debug目录下,项目添加引用选择dll。
--该dll定义了Control Patterns为空的点击事件类BaseClass;
--该dll定义了查找控件属性类PropertyConditions;
一、 C#生成DLL文件
1. 在VS2015,文件->新建项目->项目类型visual C#->类库(注意必须是类库)
--即新建一个由纯.cs 类库文件组成的程序集。
2. 编写代码 详细代码见附录:
-文件名:Class1.cs
-namespace:BaseTest
-类名:BaseClass
3. 生成->生成[解决方案名]
这样你的\Projects\ClassLibrary2\ClassLibrary2\bin\Debug文件夹或者\Projects\ClassLibrary2\ClassLibrary2\obj\Debug文件夹里便会自动生成 dll文件,该文件名称与项目名称一致,即为ClassLibrary2.dll。
二、引用DLL文件
a. 首先把dll文件放到应用程序…\bin\Debug\下;
b. 然后在解决方案中添加引用:右键鼠标-->添加引用-->浏览-->选择dll放置路径后点击“确定”。
c. 在应用文件头处使用using BaseTest;
调用 dll中方法时使用BaseClass.方法名
三、附录:自定义类库代码
using System;
using System.Text;
using System.Windows;
using System.Windows.Automation;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace BaseTest
{
public class BaseClass
{
#region ClickMouse
#region Import DLL
/// <summary>
/// Add mouse move event
/// </summary>
/// <param name="x">Move to specify x coordinate</param>
/// <param name="y">Move to specify y coordinate</param>
/// <returns></returns>
\[DllImport("user32.dll")\]
extern static bool SetCursorPos(int x, int y);
/// <summary>
/// Mouse click event
/// </summary>
/// <param name="mouseEventFlag">MouseEventFlag </param>
/// <param name="incrementX">X coordinate</param>
/// <param name="incrementY">Y coordinate</param>
/// <param name="data"></param>
/// <param name="extraInfo"></param>
\[DllImport("user32.dll")\]
extern static void mouse\_event(int mouseEventFlag, int incrementX, int incrementY, uint data, UIntPtr extraInfo);
const int MOUSEEVENTF\_MOVE = 0x0001;
const int MOUSEEVENTF\_LEFTDOWN = 0x0002;
const int MOUSEEVENTF\_LEFTUP = 0x0004;
const int MOUSEEVENTF\_RIGHTDOWN = 0x0008;
const int MOUSEEVENTF\_RIGHTUP = 0x0010;
const int MOUSEEVENTF\_MIDDLEDOWN = 0x0020;
const int MOUSEEVENTF\_MIDDLEUP = 0x0040;
const int MOUSEEVENTF\_ABSOLUTE = 0x8000;
#endregion
public static void ClickLeftMouse(int processId, string automationId)
{
AutomationElement element = FindElementById(processId, automationId);
if (element == null)
{
throw new NullReferenceException(string.Format("Element with AutomationId '{0}' and Name '{1}' can not be find.",
element.Current.AutomationId, element.Current.Name));
}
Rect rect = element.Current.BoundingRectangle;
int IncrementX = (int)(rect.Left + rect.Width / );
int IncrementY = (int)(rect.Top + rect.Height / );
//Make the cursor position to the element.
SetCursorPos(IncrementX, IncrementY);
//Make the left mouse down and up.
mouse\_event(MOUSEEVENTF\_LEFTDOWN, IncrementX, IncrementY, , UIntPtr.Zero);
mouse\_event(MOUSEEVENTF\_LEFTUP, IncrementX, IncrementY, , UIntPtr.Zero);
}
#endregion
public static void ClickLeftMouseByName(int processId, string name)
{
AutomationElement element = FindElementByName(processId, name);
if (element == null)
{
throw new NullReferenceException(string.Format("Element with Name '{0}' and Name '{1}' can not be find.",
element.Current.Name, element.Current.Name));
}
Rect rect = element.Current.BoundingRectangle;
int IncrementX = (int)(rect.Left + rect.Width / );
int IncrementY = (int)(rect.Top + rect.Height / );
//Make the cursor position to the element.
SetCursorPos(IncrementX, IncrementY);
//Make the left mouse down and up.
mouse\_event(MOUSEEVENTF\_LEFTDOWN, IncrementX, IncrementY, , UIntPtr.Zero);
mouse\_event(MOUSEEVENTF\_LEFTUP, IncrementX, IncrementY, , UIntPtr.Zero);
}
/// <summary>
/// Get the automation elemention of current form.
/// </summary>
/// <param name="processId">Process Id</param>
/// <returns>Target element</returns>
public static AutomationElement FindWindowByProcessId(int processId)
{
AutomationElement targetWindow = null;
int count = ;
try
{
Process p = Process.GetProcessById(processId);
targetWindow = AutomationElement.FromHandle(p.MainWindowHandle);
return targetWindow;
}
catch (Exception ex)
{
count++;
StringBuilder sb = new StringBuilder();
string message = sb.AppendLine(string.Format("Target window is not existing.try #{0}", count)).ToString();
if (count > )
{
throw new InvalidProgramException(message, ex);
}
else
{
return FindWindowByProcessId(processId);
}
}
}
// Get the automation element by automation Id.
public static AutomationElement FindElementById(int processId, string automationId)
{
AutomationElement aeForm = FindWindowByProcessId(processId);
AutomationElement tarFindElement = aeForm.FindFirst(TreeScope.Descendants,
new PropertyCondition(AutomationElement.AutomationIdProperty, automationId));
return tarFindElement;
}
// Get the automation element by Name.
public static AutomationElement FindElementByName(int processId, string name)
{
AutomationElement aeForm = FindWindowByProcessId(processId);
AutomationElement tarFindElement = aeForm.FindFirst(TreeScope.Descendants,
new PropertyCondition(AutomationElement.NameProperty, name));
return tarFindElement;
}
// get the button element and click
public static void ClickButtonById(int processId,string buttonId)
{
AutomationElement element = FindElementById(processId,buttonId);
if (element == null)
{
throw new NullReferenceException(string.Format("Element with AutomationId '{0}' can not be find.", element.Current.Name));
}
InvokePattern currentPattern = GetInvokePattern(element);
currentPattern.Invoke();
}
#region InvokePattern helper
/// <summary>
/// Get InvokePattern
/// </summary>
/// <param name="element">AutomationElement instance</param>
/// <returns>InvokePattern instance</returns>
public static InvokePattern GetInvokePattern(AutomationElement element)
{
object currentPattern;
if (!element.TryGetCurrentPattern(InvokePattern.Pattern, out currentPattern))
{
throw new Exception(string.Format("Element with AutomationId '{0}' and Name '{1}' does not support the InvokePattern.",
element.Current.AutomationId, element.Current.Name));
}
return currentPattern as InvokePattern;
}
#endregion
}
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章