Page Object 模式编写UiAutomator脚本
在我们学习Page Object Model之前,我们先了解一下Page Object Model(以下简称POM).
为什么要POM
用UiAutomator启动UI自动化测试不是一件困难的任务。你只需要查找元素,对元素操作就可以了。来看一个登录APP的简单的脚本。
package com.gqou.testdemo; import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiSelector; import org.junit.Test;
import org.junit.runner.RunWith; import static junit.framework.TestCase.assertEquals; /**
* Created by guangqian on 2016/4/22.
*/
@RunWith(AndroidJUnit4.class)
public class SimpleTest { @Test
public void 测试登录成功() throws Exception{
// 查找图标并点击启动app
UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
uiDevice.findObject(new UiSelector().text("TestDemo")).clickAndWaitForNewWindow();
// 输入用户名,密码并点击Login
UiObject usernameObj = uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/name_txt"));
UiObject pwdObj = uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/pwd_txt"));
UiObject loginBtn = uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/login_btn"));
UiObject welcomeTip = uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/welcome_tip")); usernameObj.click();
usernameObj.setText("username");
pwdObj.click();
pwdObj.setText("password"); loginBtn.clickAndWaitForNewWindow(); // 校验登录成功信息
assertEquals("congratulations", welcomeTip.getText());
}
}
什么是POM
POM的优点
怎么实现POM
完整的例子:
LoginActivity.java
package com.gqou.testdemo.pages; import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiSelector; /**
* Created by guangqian on 2016/4/22.
*/
public class LoginActivity { UiDevice uiDevice;
UiObject mUserName;
UiObject mPasswd;
UiObject mLogin; public LoginActivity(UiDevice uiDevice){
this.uiDevice = uiDevice;
mUserName = this.uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/name_txt"));
mPasswd = this.uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/pwd_txt"));
mLogin = this.uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/login_btn"));
} /**
* 输入用户名
* @param userName
* @throws Exception
*/
private void setmUserName(String userName) throws Exception{
mUserName.click();
mUserName.setText(userName);
} /**
* 输入密码
* @param pwd
* @throws Exception
*/
private void setmPasswd(String pwd) throws Exception{
mPasswd.click();
mPasswd.setText(pwd);
} /**
* 点击登录按钮
* @throws Exception
*/
private void clickLogin()throws Exception{
mLogin.clickAndWaitForNewWindow();
} /**
* 封装登录App操作
* @param username
* @param pwd
* @throws Exception
*/
public void loginApp(String username, String pwd) throws Exception{
this.setmUserName(username);
this.setmPasswd(pwd);
this.clickLogin();
}
}
WelcomeActivity.java
package com.gqou.testdemo.pages; import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiSelector; /**
* Created by guangqian on 2016/4/22.
*/
public class WelcomeActivity {
UiDevice uiDevice;
UiObject welcomeTip; public WelcomeActivity(UiDevice uiDevice){
this.uiDevice = uiDevice;
welcomeTip = this.uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/welcome_tip"));
} /**
* 获取欢迎提示语内容
* @return
* @throws Exception
*/
public String getWelcomeTip() throws Exception{
return welcomeTip.getText();
} }
POMForLoginTest.java
package com.gqou.testdemo.testcases; import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiSelector; import com.gqou.testdemo.pages.LoginActivity;
import com.gqou.testdemo.pages.WelcomeActivity; import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith; import static junit.framework.TestCase.assertEquals;
/**
* Created by guangqian on 2016/4/22.
*/
@RunWith(AndroidJUnit4.class)
public class POMForLoginTest { public static UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
private static LoginActivity objLogin;
private static WelcomeActivity objWelcome; @Before
public void setUp() throws Exception {
// 打开应用
uiDevice.findObject(new UiSelector().text("TestDemo")).clickAndWaitForNewWindow();
// 创建界面实例对象
objLogin = new LoginActivity(uiDevice);
objWelcome = new WelcomeActivity(uiDevice); } @Test
public void 测试App登录成功() throws Exception {
// 登录app
objLogin.loginApp("Tom", "123456");
// 获取主界面提示语
String tips = objWelcome.getWelcomeTip();
// 判断提示语是否为预期
assertEquals("congratulations", tips);
}
}
Good Luck!
水平有限,欢迎各位大牛点评,多谢支持!
Page Object 模式编写UiAutomator脚本的更多相关文章
- 转 Page Object模式
Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium测试页面中可以通 ...
- UI自动化测试的Page Object模式
在UI级的自动化测试框架中,当页面样式改变或者页面元素属性改变,那么代码也要随之进行修改,如何做到高效快速的修改代码来适应这些改变呢,这个时候可以引入Page Object模式,也是页面对象设计模式. ...
- 【C#|.NET】从细节出发(三) 逻辑层事务和page object模式
一. 业务逻辑层的事务问题 如果你的程序分层清晰并且系统禁用复杂存储过程,那么在DA中的职责比较单一.程序的逻辑通过BLL调用各种不同模块的DA来实现数据操作.如果当需要不同模块在一个事务的时候,问题 ...
- selenium page object模式
页面对象模式将测试代码和被测试页面的元素及操作进行分离,以降低页面元素的变化对测试代码的影响.每个被测试的页面都会被定义一个类,类中会定位元素和操作. 如果不使用page object模式,则相同的操 ...
- 浅析selenium的page object模式
selenium目前比较流行的设计模式就是page object,那么到底什么是page object呢,简单来说,就是把页面作为对象,在使用中传递页面对象,来使用页面对象中相应的成员或者方法,能更好 ...
- python+selenium自动化软件测试(第7章):Page Object模式
什么是Page ObjectModel模式Page Objects是selenium的一种测试设计模式,主要将每个页面看作是一个class.class的内容主要包括属性和方法,属性不难理解,就是这个页 ...
- 使用page object模式抓取几个主要城市的pm2.5并从小到大排序后写入txt文档
#coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...
- python selenium-8 Page Object模式
封装空间操作为一个接口使用,而不是直接在页面中查找 from selenium import webdriver from selenium.webdriver.common.by import By ...
- web自动化中的page object模式
一. 原理 将页面的元素定位和元素行为封装成一个page类,实现页面对象和测试用例分离 类的属性:元素定位 类的行为:元素的操作 测试用例:调用所需页面对象中的行为,组成测试用例 二. 好处 1. 当 ...
随机推荐
- js和css分别实现透明度的动画实现
js实现 两个函数 即setInterval和setTimeout setTimeout((function(){})(1/10),1*100) 该函数有两个参数,第一个为执行的函数,第二个为事件参数 ...
- 自己在使用的English词典
一.ESL/非母语词典 二.EFL/母语词典 1.American Heritage Dictionary 2.World Book Dictionary 3.Oxford Dictionary of ...
- (hdu)1285 确定比赛名次
Problem Description 有N个比赛队(<=N<=),编号依次为1,,,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接 ...
- Object-API-NSLog
NSLog中的基础数据类型 输出格式: NSLog("") char: %c short int: %hi %hx %ho unsigned short int: %hu %hx ...
- CentOS7修改网卡为eth0
CentOS7修改网卡为eth0 1.编辑网卡信息 [root@linux-node2~]# cd /etc/sysconfig/network-scripts/ #进入网卡目录 [root@lin ...
- ThinkPHP下使用Ueditor
在做课程设计的时候想到用百度的Ueditor,可在配置的时候出现了一些问题 Ueditor感觉不是很难,以前有个人定制的,现在取消了这项服务,但是我们可以自己进行配置 下载地址:http://uedi ...
- PHP模块设计
1.强内聚,功能尽量在类的内部完成 2.弱耦合,开放尽量少的方法给外部调用
- TDirectory.GetFiles获取指定目录下的文件
使用函数: System.IOUtils.TDirectory.GetFiles 所有重载: class function GetFiles(const Path: string): TStringD ...
- 学习python网络数据采集笔记-1、2章
英文不好只能看中文版的.邮电出版社翻译的真很烂. 以上是吐槽,以下是正文. 书中用的pthon 3.X版本,建议安装python3.4以上的版本,低版本的没有自带pip安装插件会比较麻烦. 下载地址: ...
- 15个Docker基本命令及用法
Docker入门教程:15个Docker基本命令及用法 本文中,我们将学习15个Docker命令以及命令的用法和功能,并通过实践学习它是如何工作的. AD:51CTO 网+ 第十二期沙龙:大话数据 ...