11.1.5 案例分析
案例11-19:图片切换APP。
图片切换APP的功能:打开图片切换APP,名字为Demo5,页面上存在图片A和图片B。图片A是显示的,图片B是隐藏的。点击手机屏幕,图片A变为隐藏的,图片B变为显示的。再点击手机屏幕,图片A变为显示的,图片B变为隐藏的,如此循环。APP代码如下(这里仅给出MainActivety.java):
package com.example.demo5; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; public class MainActivity extends Activity { private FrameLayout root; private ImageView ivA,ivB; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); root =(FrameLayout)findViewById(R.id.root); ivA =(ImageView)findViewById(R.id.imageView1); ivB =(ImageView)findViewById(R.id.imageView2); showA(); } public void rootClick(View view){ if (ivA.getVisibility()==View.VISIBLE){ showB(); }else{ showA(); } } private void showA(){ ivA.setVisibility(View.VISIBLE); ivB.setVisibility(View.INVISIBLE); } private void showB(){ ivA.setVisibility(View.INVISIBLE); ivB.setVisibility(View.VISIBLE); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main,menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button,so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
测试用例的步骤是:
(1)显示所有APP。
(2)找到需要测试的APP,Demo5。
(3)进入Demo5,向左旋转屏幕。
(4)点击屏幕,图片A消失,图片B显示。
(5)再次点击屏幕,使得图片A显示,图片B消失。
(6)测试结束。
测试代码如下:
package com.jerry; import android.os.RemoteException; import android.widget.ListView; import android.widget.Switch; import com.android.uiautomator.testrunner.UiAutomatorTestCase; import com.android.uiautomator.core.UiDevice; import com.android.uiautomator.core.UiObject; import com.android.uiautomator.core.UiObjectNotFoundException; import com.android.uiautomator.core.UiScrollable; import com.android.uiautomator.core.UiSelector; public void myDemo() throws UiObjectNotFoundException { // 模拟HOME键点击事件 getUiDevice().pressHome(); // 现在打开了主屏应用,模拟点击所有应用按钮操作,来启动所有应用界面 // 如果使用了uiautomatorviewer查看主屏,则可以发现“所有应用”按钮的 // content-description属性为“Apps”。可以使用该属性找到该按钮 UiObject allAppsButton = new UiObject(new UiSelector().description("Apps")); // 模拟点击所有应用按钮,并等待所有应用界面起来 allAppsButton.clickAndWaitForNewWindow(); // 在所有应用界面,时钟应用位于Apps tab界面中。下面模拟用户点击Apps tab操作 // 找到appstab按钮 UiObject appsTab = new UiObject(new UiSelector().text("Apps")); // 模拟点击appstab appsTab.click(); // 然后在appstab界面模拟用户滑动到Demo5应用的操作 // 由于Apps界面是可以滚动的,所以用UiScrollable对象 UiScrollable appViews = new UiScrollable(new UiSelector().scrollable(true)); // 设置滚动模式为水平滚动(默认为垂直滚动) appViews.setAsHorizontalList(); if (allAppsButton.exists() && allAppsButton.isEnabled()) { // allAppsButton在当前界面已经不可见了 所以这里不会执行 allAppsButton.click(); } // 查找应用,并点击 UiObject settingsApp = appViews.getChildByText( new UiSelector().className(android.widget.TextView.class.getName()),"Demo5"); settingsApp.clickAndWaitForNewWindow(); //向左转 try { UiDevice.getInstance().setOrientationLeft(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 模拟点击Demo5 UiObject myroot=new UiObject(new UiSelector().className("android.view.View").instance(0)); myroot.click(); sleep(3000); myroot.click(); sleep(3000); getUiDevice().pressHome(); } public static void main(String[] args){ String jarName="myTest"; String testClass="com.jerry.myTest"; String testName="myDemo"; String androidID="1"; new UiAutomatorHelper(jarName,testClass,testName,androidID); } }
这段代码的头部可以通用,所以可以封装一个类,建立代码Enter.java:
packagecom.jerry; importcom.android.uiautomator.testrunner.UiAutomatorTestCase; importcom.android.uiautomator.core.UiObject; importcom.android.uiautomator.core.UiObjectNotFoundException; importcom.android.uiautomator.core.UiScrollable; importcom.android.uiautomator.core.UiSelector; public class Enter extends UiAutomatorTestCase { public static String App=null; public Enter(String App){ this.App=App; } public void comming() throws UiObjectNotFoundException{ // 现在打开了主屏应用,模拟点击所有应用按钮操作来启动所有应用界面。 // 如果你使用了uiautomatorviewer来查看主屏,则可以发现“所有应用”按钮的 // content-description 属性为“Apps”。可以使用该属性来找到该按钮。 UiObject allAppsButton = new UiObject(new UiSelector().description("Apps")); // 模拟点击所有应用按钮,并等待所有应用界面起来 allAppsButton.clickAndWaitForNewWindow(); // 在所有应用界面,App应用位于Apps tab界面中。下面模拟用户点击Apps tab操作。 //找到 Apps tab 按钮 UiObject appsTab = new UiObject(new UiSelector().text("Apps")); //模拟点击 Apps tab. appsTab.click(); // 然后在 Appstab界面,模拟用户滑动到时钟应用的操作。 //由于Apps界面是可以滚动的,所有用 // UiScrollable 对象. UiScrollable appViews = new UiScrollable(new UiSelector().scrollable(true)); // 设置滚动模式为水平滚动(默认为垂直滚动) appViews.setAsHorizontalList(); if (allAppsButton.exists() && allAppsButton.isEnabled()) { //allAppsButton在当前界面已经不可见了所以这里不会执行 allAppsButton.click(); } // 查找this.App应用并点击 UiObject settingsApp =appViews.getChildByText( new UiSelector().className(android.widget.TextView.class.getName()), this.App); settingsApp.clickAndWaitForNewWindow(); } }
我们如果要测试一个APP,在开始只要建立Enter类的构建,构建参数为显示在Android手机屏幕菜单上的名字。这样我们的代码将变为:
public void myDemo() throwsUiObjectNotFoundException { // 模拟 HOME 键点击事件 getUiDevice().pressHome(); Enter enter=new Enter("Demo5"); enter.comming(); // 左转 try { UiDevice.getInstance().setOrientationLeft(); } catch (RemoteException e) { e.printStackTrace(); } UiObject myroot=new UiObject(newUiSelector().className("android.view.View").instance(0)); myroot.click(); sleep(8000); myroot.click(); sleep(8000); UiDevice.getInstance().pressHome(); }
在这里屏幕菜单显示的APP为Demo5,所以只要在构建的时候使用Enter enter=newEnter("Demo5");即可。
案例11-20:注册登录APP。
进入注册登录APP,显示如图11-46所示,如果是注册用户,可以在这里输入用户名和密码,然后点击【登录】按键进行登录。否则点击【进行注册】按钮,进入注册页面,如图11-47所示。登录成功显示登录成功信息,如图11-48所示。为了测试方便,临时在首页加了一个按键【清除】,功能是清除所有注册的用户信息。
测试步骤为:
(1)调用案例11-19中的Enter类找到测试程序Demo4。
图11-46 登录页面
图11-47 注册页面
图11-48 登录成功页面
(2)进入注册页面,输入注册信息。
(3)返回登录页面进行登录。
(4)通过判断登陆成功页面的元素是否存在来判断登录是否成功
(5)退出登录
(6)清空数据库
测试代码如下:
public void CheckDemo4() throwsUiObjectNotFoundException { Stringusername = "Guxiang"; Stringpassword = "123456"; // 模拟 HOME 键点击事件 getUiDevice().pressHome(); Enterenter=new Enter("Demo4"); enter.comming(); //注册 UiSelectorbuton=new UiSelector().resourceId("com.example.demo4:id/button2"); UiObjectobj = new UiObject(buton); obj.click(); // 输入注册信息 UiSelector enusername=newUiSelector().resourceId("com.example.demo4:id/username1"); obj =new UiObject(enusername); obj.clearTextField(); obj.setText(username); UiSelector enpassword=newUiSelector().resourceId("com.example.demo4:id/password1"); obj =new UiObject(enpassword); obj.clearTextField(); obj.setText(password); UiSelectorbutton=new UiSelector().resourceId("com.example.demo4:id/button11"); obj =new UiObject(button); obj.click(); //输入登录信息 enusername=newUiSelector().resourceId("com.example.demo4:id/username"); obj =new UiObject(enusername); obj.clearTextField(); obj.setText(username); enpassword=newUiSelector().resourceId("com.example.demo4:id/password"); obj =new UiObject(enpassword); obj.clearTextField(); obj.setText(password); button=newUiSelector().resourceId("com.example.demo4:id/button1"); UiObjectobj4 = new UiObject(button); obj4.click(); UiSelector welcomeinfo=newUiSelector().resourceId("com.example.demo4:id/welcomeinfo"); UiObjectobj1 = new UiObject(welcomeinfo); //通过判断登陆成功页面的元素是否存在来判断登录是否成功 if(obj1.exists ()) { System.out.println("Objectexists!"); }else{ System.out.println("Objectis not exist!"); } //退出 button=newUiSelector().resourceId("com.example.demo4:id/logout"); obj =new UiObject(button); obj.click(); //清空数据库 button=newUiSelector().resourceId("com.example.demo4:id/exit"); obj =new UiObject(button); obj.click(); UiDevice.getInstance().pressHome(); }
更多关于UiAutomator的知识,见参考文献【11】。
顾翔凡言:
不是好的工作会给你带来好的心情,而是好的心情会给你带来好的工作。