在基于 Eclipse 的应用程序中实际使用 RFT find 方法
在测试基于 Eclipse 的应用程序中使用 find 方法的这个实例仅局限于 AUT 的一个部分,作为得出对象 getter 方法的设计的一个途径。本应用程序中的对象具有可识别的模式。标准的 SWT 对象是主要被使用的,但还有应用程序开发团队提供的一些专门的定制类。
测试开发人员创建一个通用的方法来获取一个特定类的所有对象,或者获取一个具体父对象下给定索引号的一个对象。要使得自动化在应用程序的局部版本上工作,测试开发人员决定使用对象索引作为寻找对象的关键属性,而不是文本。下面介绍的类将用于做这件事。
注意:这些类中的所有方法都是静态的,所以测试开发人员不需要将这个类实例化为一个对象就可以使用这些方法。可以通过使用以下格式来调用它们:<class name>. <method name> (<parameters>)
。
FindAppObjects.java 类可以让您使用两个不同的方法:getAllObjects 和 getObjectAtIndex
。这些方法通常不直接使用,但它们是其他方法的基础。然而,您可以直接使用它们来确定通过哪些索引号找到哪些对象。
/** * Given a parent object, find all descendant test objects with a * given class. * @param parent TestObject * @param className String * @return Array of TestObject or null if no objects of type * className were found. */ public static TestObject[] getAllObjects(TestObject parent, String className) |
getAllObjects
将 TestObject 类型的父对象和 String 类型的字符串为输入,并返回包含了父对象的具体类型的所有子对象的 TestObject 的数组。此实例返回 RootTestObject 的所有子对话框:
RootTestObject root = getRootTestObject (); TestObject[] dialogs = FindAppObjects.getAllObjects(root, "javax.swing.JFrame"); |
选择正确的父 TestObject 对象是重要的,以便您可以从结果中只获得您正在寻找的对象。作为一个实例,假设下面的部分表示 AUT 中的一个对象层次:
applicationcompositegroup0button0button1group1button0button1 |
Calling getAllObjects (application, "button")
将返回一个含有四个按钮的数组。然而,如果不循环扫描该数组,并打印出每个索引号和 button[index].getProperty("text") 字符串的话,就不能很快确定哪些索引号匹配哪些按钮。
要取代这种麻烦的过程,进行一个以上的分层调用更有意义:
// get all groups in the applicationTestObject[] groups = FindAppObjects.getAllObjects (application, "group");// limit search to only buttons in the first group foundTestObject[] buttons = FindAppObjects.getAllObjects (groups[0], "button"); // click the first button found under the groupnew Button(to[0]).click(); |
getAllObjects (group0, "button")
调用只返回两个按钮,它们很可能处于正确的顺序(button0,然后 button1),如屏幕上显示的。如果整个应用程序或对话框中只有一些按钮,那么获得所有的按钮并且计算出索引可能会更容易。
/** * Given a parent object, find the descendent test object * with a given class, at a given one-based index. * * @param parent TestObject * @param className String * @param index int, zero-based index * @return TestObject or null if index is greater than * the total number of objects found. */ public static TestObject getObjectAtIndex (TestObject parent, String className, int index) |
getObjectAtIndex
精炼了 getAllObjects
的使用。它获取一个父的 TestObject 对象、一个 String 类的字符串对象,和一个以零为基数的整数,然后返回一个单个的 TestObject 对象。例如,此代码返回指定(父)分组下的第一个按钮:
TestObject to = getObjectAtIndex(group1, BUTTON, 0); |
这些方法都返回一个 TestObject 对象,并且那些可能不是您需要找的具体类型的对象。上面的两个方法都返回一般的 TestObject 对象。常常,您希望使用具体类型的对象。当使用这些方法时,确保在您将对象用于代码中之前,显式地将所返回的 TestObject 对象转换为正确的类型。
FindBasicAppObjects.java 类提供进一步的细化和辅助。它是 FindAppObjects.java 的子类,并且使用了 getObjectAtIndex 方法。它包含返回 TestObject 父对象的索引号位置的子对象的 getter 方法。这时产品对象已经被转换成为了正确的类,所以您不需要自己再次的转换它。此实例返回标准的 Eclipse SWT widget 类的一个子集,例如 org.eclipse.swt.widgets.Button:
/** * Find the index-specified org.eclipse.swt.widgets.Button * child control under the specified parent. * * @param parent TestObject * @param index int, zero-based * @return WButton */ public static WButton getButton(TestObject parent, int index) |
getDialog
是 FindBasicAppObjects.java 中唯一一个不需要父亲对象的方法,因为它假设父对象是 AUT。为了能够识别正确的对话框,即使该对话框的标题是易变的,getDialog 将正则表达式(Regex)对象作为参数,如下所示:
/** * Find a org.eclipse.swt.widgets.Shell control * with a caption specified by the given * Regular Expression (Regex). * * @param dialogCaption Regex object containing dialog's * expected caption * @return WFrame */ public static WFrame getDialog (Regex dialogCaption) |
比较 Place an Order 对话框的代码(在此部分的开头)和在下面实例中使用FindAppObjects
和 FindBasicAppObjects
的同样的行为。假设 Place an Order 对话框是 WFrame 类型的 Eclipse 对话框,并且按钮是 WButton 类型的。
public class PlaceAnOrder extends RationalTestScript { private final int CANCEL = 2; private final Regex DIALOG_CAPTION = new Regex ("^Place an Order$"); public WFrame getDialog() { return FindBasicAppObjects.getDialog(DIALOG_CAPTION); } public WButton getButtonCancel() { return FindBasicAppObjects.getButton(getDialog(),CANCEL); } public void testMain(Object[] args) { getButtonCancel().click(); } } |
前面的代码是以很容易维护的方式编写的,代码中每个部分都分隔为容易理解的一块。对于喜欢更加紧凑布局的编码人员,该代码还可以以此方式书写:
public class PlaceAnOrder extends RationalTestScript { public void testMain(Object[] args) { FindBasicAppObjects. getButton (FindBasicAppObjects. getDialog (DIALOG_CAPTION), CANCEL).click(); } } |
文章来源于领测软件测试网 https://www.ltesting.net/