注:本文最早发表在《51测试天地》第九期
检查默认焦点位置
在进行界面易用性测试和用户体验测试时,我们会要求在打开某个界面时,默认把焦点定位到某个控件,方便用户做后续的操作,例如默认定位到某个输入框,方便用户能马上输入数据。
如果用人工的方式进行检查的话,需要打开每个界面,观察当前光标的位置,检查是否定位到合适的位置上,这样会比较耗费时间。而如果采用自动化的测试方法,则可以利用控件的Focused属性当前是否为True,来判断焦点是否落在控件上。
每一个控件都会有Focused属性,可以使用Windows API函数中的GetFocus函数来获取当前焦点所在的控件,例如下面的C#代码可用于取得当前焦点所在控件的句柄:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace GetFocusTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 使用GetFocus函数获取当前焦点所在控件的句柄
Automation auto = new Automation();
IntPtr hand = auto.FindFocusWindow();
// 以十六进制显示
MessageBox.Show(hand.ToString("X"));
}
}
public class Automation
{
// 导入Windows API中的GetFocus函数
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr GetFocus();
// 获取当前焦点所在的控件
public IntPtr FindFocusWindow()
{
// 返回控件句柄
return GetFocus();
}
}
}
由代码可知,单击Button1按钮后,获取到的当前焦点所在控件必然是Button1按钮自身,这个可以使用Spy++来进一步验证,如图2所示。
图2 获取焦点所在控件的句柄
与GetFocus相对应的Windows API函数是SetFocus,用于把焦点设置到某个控件上。大部分的测试工具在实现焦点的检查和设置其实都是采用了上述过程的原理。例如在QTP中,则可以采用如下脚本来实现相同的功能:
Dialog("Login").Activate
' 如果默认焦点不在Agent Name输入框,则提示错误
If NOT Dialog("Login").WinEdit("Agent Name:").CheckProperty("focused","True" )Then
Msgbox Dialog("Login").WinEdit("Agent Name:").GetROProperty("focused")
End If
这里的CheckProperty函数和GetROProperty函数是基本上可以在每个测试对象中使用的函数,其中CheckProperty类似于检查点,用于检查测试对象的指定属性是否等于指定的值,对于控件焦点,则是focused属性,属性值为True表示焦点落在控件上,属性值为False则表示焦点没有在控件上。
GetROProperty用于获取测试对象运行时的值。通过指定focused属性,可以获取到控件的焦点属性。