java版app自动化测试初始化模板
项目目录介绍
目录结构如下:
(包含:驱动的基础配置、全局异常处理、异常截图、报告自动生成、app常用操作方法封装、常用工具类封装)
各包分层关系
basepage包负责存放app公共操作方法、AndroidDriver基础配置、testNG公共执行顺序BaseTest,对外暴露驱动等。BaseApp类包含app操作有:封装By类型的点击操作和输入框输入数据操作、切换到下一个窗口操作、上下左右滑动操作、具体坐标点击操作、直接使用adb命令的操作、前进后退刷新的操作等,其它方法可自行封住。
部分封装方法如下:
/**
* 通过元素定位拿到 Element 元素对象
*
* @param locator By 类型元素定位
* @return 定位到的元素
*/
public WebElement locateElement(AndroidDriver driver,By locator) {
try {
wait = new WebDriverWait(driver, 10);
return wait.until(ExpectedConditions.presenceOfElementLocated(locator));
}catch (NoSuchElementException | TimeoutException e) {
System.out.println("================当前页面未捕获该元素,继续执行用例==================");
}
return null;
}
/**
* 点击元素
* @param locator By 类型元素定位,做弹框或元素异常后接着往下执行
* @return 点击的元素
*/
public WebElement clickButton(AndroidDriver driver,By locator) {
try {
long time1 = DateUtils.getCurrentMillisecond();
MobileElement buttonElement = (MobileElement) locateElement(driver,locator);
wait.until(ExpectedConditions.elementToBeClickable(locator));
if (buttonElement.isEnabled()){
buttonElement.click();
log.info("该点击事件耗时时间(ms):"+(DateUtils.getCurrentMillisecond()-time1));
return buttonElement;
}
} catch (NoSuchElementException | TimeoutException e) {
System.out.println("================当前页面未捕获该元素,截图保留>>>>继续执行用例==================");
ScreenshotUtil.snapshot(driver);
}
return null;
// System.out.println("改点击事件耗时时间(ms):"+(DateUtils.getCurrentMillisecond()-time1));
}
/**
* 输入框输入数据
* @param locator By 类型元素定位
* @param content 输入的内容,支持多内容,可以键盘输入
* @return 输入框元素
*/
public WebElement sendInput(AndroidDriver driver,By locator, CharSequence... content) {
WebElement inputElement = locateElement(driver,locator);
inputElement.clear();
inputElement.sendKeys(content);
return inputElement;
}
/*=====================通过动作滑动==================================*/
/**
*向上滑动操作
*/
public void swipeToUp(AndroidDriver driver) {
int width = driver.manage().window().getSize().width;
int height = driver.manage().window().getSize().height;
TouchAction action=new TouchAction(driver).press(PointOption.point(width/2, height*3/4)).waitAction(WaitOptions.waitOptions(duration))
.moveTo(PointOption.point(width/2, height/4)).release();
action.perform();
}
/**
*向下滑动操作
*/
public void swipeToDown(AndroidDriver driver) {
int height = driver.manage().window().getSize().height;
int width = driver.manage().window().getSize().width;
TouchAction action=new TouchAction(driver).press(PointOption.point(width/2, height/4)).waitAction(WaitOptions.waitOptions(duration))
.moveTo(PointOption.point(width/2, height*3/4)).release();
action.perform();
}
/**
*向左滑动操作
*/
public void swipeToLeft(AndroidDriver driver) {
int width = driver.manage().window().getSize().width;
int height = driver.manage().window().getSize().height;
TouchAction action=new TouchAction(driver).press(PointOption.point(width*3/4, height/2)).waitAction(WaitOptions.waitOptions(duration))
.moveTo(PointOption.point(width/4,height/2)).release();
action.perform();
}
/**
*向右滑动操作
*/
public void swipeToRight(AndroidDriver driver) {
int width = driver.manage().window().getSize().width;
int height = driver.manage().window().getSize().height;
TouchAction action=new TouchAction(driver).press(PointOption.point(width / 4, height / 2)).waitAction(WaitOptions.waitOptions(duration))
.moveTo(PointOption.point(width*3/4,height/2)).release();
action.perform();
}
/*=====================通过具体坐标点击操作,appium&&adb两种方式==================================*/
/**
* 通过具体坐标点击
*/
public void taptest(AndroidDriver driver,int x, int y){
/**设置显示等待时间10s driver=baseAndroidDriver.getDriver(baseConfig)
特注:显示等待与隐式等待相对,显示等待必须在每一个需要等待的元素前面进行声明,如果在规定的时间内找到元素,则直接执行,即找到元素就执行相关操作
*/
wait = new WebDriverWait(driver,5);
//tap点击坐标,输入坐标,然后再release()释放坐标点,用perform()去执行一系列action操作
action = new TouchAction(driver).tap(PointOption.point(x,y)).release().perform();
}
/**
* 通过adb命令驱动被测设备
*/
public void adbInput(AndroidDriver driver ,String input){
try {
Process process = Runtime.getRuntime().exec(input);
wait = new WebDriverWait(driver,5);
process.destroy();
} catch (IOException e) {
e.printStackTrace();
}
}
page包(通用PO模式):分为data数据包和element元素操作包,把定位元素和输入框数据统一放到data包中,元素的操作放到element包中。其中元素的操作数据来源于data包中。

testcase包是根据业务流程编写用例步骤(后面的用例维护均在此包下)

resource包下可以放chromedriver驱动或者存放异常捕获的截图、测试报告自动生成index.html报告(由于使用springboot可以直接访问报告)另一种测试报告用的最多的是allure2,一个开源很好的报告模板allure2 的GitHub地址测试报告输出到allure-results包下。

allure2报告集成,win下需要先下载allure2的zip包GitHub官网下载地址allure2,下载zip包后需要配置下环境变量,用例执行完成后会生成allure-results文件夹,在当前文件夹下执行
allure serve allure-results
即可自动打开web测试报告,如下:

- extentreports报告样式如图(这里把项目源码路径修改了下,需要单独导下包,具体见接口自动化测试文章介绍)

该项目源码地址
模板流程说明
- 1、先在testcase包内写测试用例流程,testcase包下的类需要继承BaseTest 来获取driver驱动
eg:
public class YynCases extends BaseTest {
/**
* 测试示例用例,继承BaseTest获取driver驱动
* 操作层
*/
EnterYynElemnt enterMiniElemnt = new EnterYynElemnt();
public void getDriverCase(){
System.out.println(driver);
//点击弹框按钮
enterMiniElemnt.popupClick(driver);
}
}
- 2、创建page包下的element包中的元素操作类,即:EnterYynElemnt 类此包下的类需要继承BaseApp类来获取封装的公共操作方法。
@Slf4j
public class EnterYynElemnt extends BaseApp{
/**
* 继承BaseApp使用公共封装方法
* */
//点击弹框
public void popupClick(AndroidDriver driver) {
//使用封装By类型元素定位,且数据和元素分离
log.info("点击弹框");
clickButton( driver, PopupData.POPUP1);
}
}
- 3、创建page包下的data包的定位数据或者是输入框数据,所有的元素定位和输入数据均在此包下维护。上面参数POPUP1通过id定位,PopupData类下的POPUP1数据如下:
public class PopupData {
//升级弹框
public static final By POPUP1= By.id("com.tengyun.yyn:id/layout_confirm_cancel");
//第二个弹框
public static final By POPUP2 = By.id("com.tengyun.yyn:id/layout_activity_cancel");
- 4、其中第二步使用的是BaseApp封装的公共类方法clickButton
public WebElement clickButton(AndroidDriver driver,By locator) {
try {
long time1 = DateUtils.getCurrentMillisecond();
MobileElement buttonElement = (MobileElement) locateElement(driver,locator);
wait.until(ExpectedConditions.elementToBeClickable(locator));
if (buttonElement.isEnabled()){
buttonElement.click();
log.info("该点击事件耗时时间(ms):"+(DateUtils.getCurrentMillisecond()-time1));
return buttonElement;
}
} catch (NoSuchElementException | TimeoutException e) {
System.out.println("================当前页面未捕获该元素,截图保留>>>>继续执行用例==================");
ScreenshotUtil.snapshot(driver);
}
return null;
// System.out.println("改点击事件耗时时间(ms):"+(DateUtils.getCurrentMillisecond()-time1));
}
输入框输入数据方法也是很常用的
public WebElement sendInput(AndroidDriver driver,By locator, CharSequence... content) {
WebElement inputElement = locateElement(driver,locator);
inputElement.clear();
inputElement.sendKeys(content);
return inputElement;
}
- 5、最后可以统一把testcase包下的类放到testNG的入口中执行测试并生成报告(由于使用springboot框架没有用testNG的xml配置,而是通过封装方法进行配置)
/**
* 测试用例总入口
* */
@Test
public void runCases(){
//执行测试用例入口
BaseTestngInit baseTestngInit = new BaseTestngInit();
baseTestngInit.baseTestngInitCode();
}
testNG封装的工具类BaseTestngInit(工具类中也可以通过testng.xml初始化testng,具体看个人使用习惯)
/**
* 初始化testng
*/
public void baseTestngInitCode() {
//创建testng对象
TestNG testng = new TestNG();
//创建报告监听器对象
ExtentTestNGIReporterListener reportListener = new ExtentTestNGIReporterListener();
// TestLogListener testLogListener = new TestLogListener();
//设置需要执行的测试用例类
testng.setTestClasses(new Class[] { com.iappium.testcase.YynCases.class});
//添加监听器
testng.addListener(reportListener);
// testng.addListener(testLogListener);
//运行测试
testng.run();
}
- 更多测试技术分享、学习资源以及一些其他福利可关注公众号:【Coding测试】获取:

java版app自动化测试初始化模板的更多相关文章
- APP自动化框架-ATX原理解析及JAVA版客户端
作为网易开源的ATX APP自动化测试框架,对比现有的macaca自动化框架/Appium自动化框架,最大的特别就是在于可远程进行自动化测试 先给大家看一张我自己梳理的框架架构图 框架巧妙点: 1. ...
- Android Hybrid App自动化测试实战讲解(基于python)
1.Hybrid App自动化测试概要 什么是Hybrid App? Hybrid App(混合模式移动应用)是指介于web-app.native-app这两者之间的app,兼具“Native App ...
- app 自动化测试 - 多设备并发 -appium+pytest+ 多线程
1.appium+python 实现单设备的 app 自动化测试 启动 appium server,占用端口 4723 电脑与一个设备连接,通过 adb devices 获取已连接的设备 在 pyth ...
- Windows下部署Appium教程(Android App自动化测试框架搭建)
摘要: 1,appium是开源的移动端自动化测试框架: 2,appium可以测试原生的.混合的.以及移动端的web项目: 3,appium可以测试ios.android.firefox os: 4,a ...
- 第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备
相信很多人或多或少听说了微信公众平台的火热.但是开发还是有一点门槛,鉴于挺多朋友问我怎么开发,问多了,自己平时也进行以下总结.所以下面给大家分享一下我的经验: 微信公众号是什么? 官网的介绍:再小的个 ...
- Android Native App自动化测试实战讲解(上)(基于python)
1.Native App自动化测试及Appuim框架介绍 android平台提供了一个基于java语言的测试框架uiautomator,它一个测试的Java库,包含了创建UI测试的各种API和执行自动 ...
- 8人/天,小记一次 JAVA(APP后台) 项目改造 .NET 过程(后台代码已完整开源于 Github)
Github: https://github.com/iccb1013/Jade.Net 我们只消耗了8人/天的时间,完成了全部工作,基于我们 Jade.Net 的开源后台代码,任何小规模的后台管理系 ...
- 移动app自动化测试
原文出处https://www.toutiao.com/i6473606106970063374/ 原文作者是今日头条的:一个字头的诞生 在此感谢原文作者的无私分享! 移动App自动化测试(一) 目前 ...
- 阿里云短信验证解决方案(java版)(redis存储)
最近搞了一个互联网项目的注册,需要写一个手机号验证(由于之前没有轮子,只能自己摸索了); 1:基本思路: 1>购买了阿里云短信服务->下载阿里云短信发送demo(java版); 2> ...
随机推荐
- Kubernetes K8S之资源控制器RC、RS、Deployment详解
Kubernetes的资源控制器ReplicationController(RC).ReplicaSet(RS).Deployment(Deploy)详解与示例 主机配置规划 服务器名称(hostna ...
- Fiddler添加显示ip和响应时间
1. 打开Fiddler,在菜单Rules 栏里点击Customize Rules…或者使用快捷键CTRL+R打开Fiddler ScriptEditor 图 1 Customize Rules 2. ...
- springboot文件上传(可单文件/可多文件)
获取文件内容,是从InputStream中获取,添加到指定位置的文件 如下所示 public static void getFile(InputStream is,File fileName) thr ...
- 为何要做seo关键词排名
http://www.wocaoseo.com/thread-229-1-1.html 武汉seo百度指数在150左右,做seo的同仁们都知道这样的一件事情. 真正搜索武汉seo关键词能作为潜在客户的 ...
- 面试:为了进阿里,死磕了ThreadLocal内存泄露原因
前言 在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露.强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这 ...
- Python数据可视化之Excel气泡图
最终实现的效果如图: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类 ...
- Python 爬虫+tkinter界面 实现历史天气查询
文章目录 一.实现效果 1. python代码 2. 运行效果 二.基本思路 1. 爬虫部分 2. tkinter界面 一.实现效果 很多人学习python,不知道从何学起.很多人学习python,掌 ...
- Android开发之数组类的面试题目,android工程师java程序员必备
1,定义一个长度为5的数组 int [] arr=new int[5]; 2,写出静态初始化一个数组的方法 int [] arr={1,2,3,4}; 3,写出可变参数的使用规则 1,只能做为方 ...
- vue学习笔记一
vue 颠覆式的开发方式 解疑 为什么要学习vue? 降低项目的复杂度 就业需要 vue难不难? 特别简单 相比于React,vue有什么优势? 前端三大框架:Angular.React.Vue Vu ...
- Python程序结构
Python程序结构 分支结构 条件语句: if 判断: .....满足判断条件执行的代码块 else: .....不满足判断条件执行的代码块 if 判断1: .....满足判断条件1执行的代码块 e ...