一天一个关于测试知识点,5分钟内讲解你最关心的软件测试问题,今天就接着来谈谈关于软件测试中的“By Selector和By类介绍”。
By Selector和By类介绍
在UiAutomator 2.0中又增加了两个新的定位对象,即By Selector和By对象。BySelector和By是UiAutomator2.0的类。BySelector类为指定搜索条件进行匹配UI元素,通UiDevice.findObject(BySelector)方式进行使用。By类是一个实用程序类,可以以简洁的方式创建BySelectors对象。主要功能是使用缩短语法,提供静态工厂方法来构造BySelectors对象。例如:将使用findObject(By.text("foo")),而不是findObject(newSelector().text("foo"))的方式来查找文本值为"foo"的UI元素。
这些方法如下所表4-22所示。
案例4-17:通过By Selector和By对象定位元素。
@Test
public void testUiObject2() throws UiObjectNotFoundException,InterruptedException{
UiDevice.getInstance(instrumentation).findObject(By.desc("Apps")).click();
UiScrollable appViews = new UiScrollable(new UiSelector().scrollable(true));
appViews.setAsHorizontalList();
UiObject settingsApp = appViews.getChildByText(
new UiSelector().className(android.widget.TextView.class.getName()),"Demo5");
settingsApp.clickAndWaitForNewWindow();
UiDevice.getInstance(instrumentation).findObject(By.res("android:id/decor_content_parent")).click()
UiDevice.getInstance(instrumentation).findObject(By.res("android:id/decor_content_parent")).click();
}
UiObject类介绍
UiObject用来代表一个组件对象,它提供一系列方法和属性来模拟在手机上的实际操作。如:文本的输入和清除、点击、长按、拖动、滑动,也可获取组件的属性、判断组件对象是否存在等。
UiObject的定义方法如下。
new UiObject(UiSelector Object).actionFunction;
UiObject这节中主要介绍的是组件操作方法,即actionFunction。
(1)点击与长按操作
点击与长按操作的API如表4-23所示。
案例4-18:点击与长按操作。
new UiObject(new UiSelector().text("QQ") ).click();//点击
new UiObject(new UiSelector().text("QQ")).longClick();//长按
(2)拖拽与滑动操作
拖拽与滑动操作的API如表4-24所示。
案例4-19:拖拽与滑动操作。
new UiObject(new UiSelector().text("QQ")).dragTo(560,600,40); //把QQ移动到【560,600】坐标处,40为步长
new UiObject(new UiSelector().text("QQ")). dragTo(new UiObject(new UiSelector().text("计算器")),40); //交换QQ与计算器的位置
UiObject obj = new UiObject(new UiSelector().className("android.view.View").instance(2)).SwipeLeft(10); //向左划屏,按着第3个(0开始,所以为2)APP左划
(3)输入文本与清除文本
输入文本与清除文本的API如表4-25所示。
案例4-20:输入文本与清除文本。
new UiObject(new UiSelector().resourceId("com.example.demo4:id/username1")).clearTextField();
new UiObject(new UiSelector().resourceId("com.example.demo4:id/username1")).setText(username);
new UiObject(new UiSelector().resourceId("com.example.demo4:id/password1")).clearTextField();
new UiObject(new UiSelector().resourceId("com.example.demo4:id/password1")).setText(password);
为了防止原先文本框中有内容,建议在输入文本框之前先做一个清除的操作。
案例4-21:模拟向文本框输入写错的情况。
@Test
public void testClear() throws UiObjectNotFoundException,InterruptedException {
Util util = new Util();
util.comming("Demo4");
UiSelector enusername=new UiSelector().resourceId("com.example.demo4:id/username");
UiObject obj1 = new UiObject(enusername);
obj1.setText("hi");
Thread.sleep(1000);
obj1.clearTextField();
Thread.sleep(1000);
obj1.setText("hello");
Thread.sleep(1000);
}
为了显示清楚,在这里加了几行线程等待方法。
(4)获取对象的属性与属性的判断
获取对象的属性与属性的判断的API如表4-26所示。
案例4-22:获取子节点数量。
@Test
public void testGetChild() throws UiObjectNotFoundException,InterruptedException{
Util util = new Util();
util.comming("Demo5");
UiObject obj = new UiObject(new UiSelector().resourceId("com.example.demo5:id/root"));
int count =obj.getChildCount();
Assert.assertEquals(1,count);
for(int i=0;i<count;i++){< p="">
UiObject child = obj.getChild(new UiSelector().index(i));
Assert.assertEquals(child.getClassName(),"android.widget.ImageView");
}
}
(5)获取父类与子类节点
获取父类与子类节点的API如表4-27所示。
案例4-23:获取父类与子类节点。
String actualValue = passcodePolicyName.getFromParent(new UiSelector().className("android.widget.TextView").index(1)).getText();
if(actualValue.equals(expectedValue)) {
System.out.println(policyName + " check: Pass.");
} else {
System.out.println(policyName + " check: Failed.");
}
(6)属性判断
属性判断的API如表4-28所示。
案例4-24:判断元素是否可以checked。
if(inputTextObject.isChecked()){
inputTextObject.click(); //如果开关是开,则点击关闭。
}
(7)手势操作
手势操作包括。
l 两指平移。
l 多指平移。
l 两指合拢。
l 两指扩张。
手势操作的API如表4-29所示。
案例4-25:手势操作。
UiObject framObject = new UiObject(new UiSelector().className("android.widget.FrameLayout"));
PointerCoords p = new PointerCoords();
p.x = 100;
p.y= 100;
p.pressure = 1;
p.size = 1;
PointerCoords p1 = new PointerCoords();
p1.x = 300;
p1.y= 300;
p1.pressure = 1;
p1.size = 1;
PointerCoords p2 = new PointerCoords();
p2.x = 200;
p2.y=200;
p2.pressure = 1;
p2.size = 1;
frameObject.performMultiPointerGesture(p,p1,p2);
(7)判断对象是否存在
判断对象是否存在API如表4-30所示。
案例4-26:判断对象是否存在。
UiObject obj = new UiObject(new UiSelector().resourceId("com.example.demo4:id/welcomeinfo"));
assertNotNull(obj);