项目目录介绍
  • 目录结构如下:

    (包含:驱动的基础配置、全局异常处理、异常截图、报告自动生成、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测试报告,如下:

模板流程说明
  • 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自动化测试初始化模板的更多相关文章

  1. APP自动化框架-ATX原理解析及JAVA版客户端

    作为网易开源的ATX APP自动化测试框架,对比现有的macaca自动化框架/Appium自动化框架,最大的特别就是在于可远程进行自动化测试 先给大家看一张我自己梳理的框架架构图 框架巧妙点: 1. ...

  2. Android Hybrid App自动化测试实战讲解(基于python)

    1.Hybrid App自动化测试概要 什么是Hybrid App? Hybrid App(混合模式移动应用)是指介于web-app.native-app这两者之间的app,兼具“Native App ...

  3. app 自动化测试 - 多设备并发 -appium+pytest+ 多线程

    1.appium+python 实现单设备的 app 自动化测试 启动 appium server,占用端口 4723 电脑与一个设备连接,通过 adb devices 获取已连接的设备 在 pyth ...

  4. Windows下部署Appium教程(Android App自动化测试框架搭建)

    摘要: 1,appium是开源的移动端自动化测试框架: 2,appium可以测试原生的.混合的.以及移动端的web项目: 3,appium可以测试ios.android.firefox os: 4,a ...

  5. 第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备

    相信很多人或多或少听说了微信公众平台的火热.但是开发还是有一点门槛,鉴于挺多朋友问我怎么开发,问多了,自己平时也进行以下总结.所以下面给大家分享一下我的经验: 微信公众号是什么? 官网的介绍:再小的个 ...

  6. Android Native App自动化测试实战讲解(上)(基于python)

    1.Native App自动化测试及Appuim框架介绍 android平台提供了一个基于java语言的测试框架uiautomator,它一个测试的Java库,包含了创建UI测试的各种API和执行自动 ...

  7. 8人/天,小记一次 JAVA(APP后台) 项目改造 .NET 过程(后台代码已完整开源于 Github)

    Github: https://github.com/iccb1013/Jade.Net 我们只消耗了8人/天的时间,完成了全部工作,基于我们 Jade.Net 的开源后台代码,任何小规模的后台管理系 ...

  8. 移动app自动化测试

    原文出处https://www.toutiao.com/i6473606106970063374/ 原文作者是今日头条的:一个字头的诞生 在此感谢原文作者的无私分享! 移动App自动化测试(一) 目前 ...

  9. 阿里云短信验证解决方案(java版)(redis存储)

    最近搞了一个互联网项目的注册,需要写一个手机号验证(由于之前没有轮子,只能自己摸索了); 1:基本思路: 1>购买了阿里云短信服务->下载阿里云短信发送demo(java版); 2> ...

随机推荐

  1. Mybatis—curd

    Mybatis简介: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...

  2. 超级码力编程赛带着6万奖金和1200件T恤向你跑来了~

    炎炎夏日,总是感觉很疲劳,提不起一点精神怎么办?是时候参加一场比赛来唤醒你的激情了!阿里云超级码力在线编程大赛震撼携手全国数百所高校震撼来袭. 它来了,它来了,它带着60000现金和1200件T恤向你 ...

  3. React State

    React 里只需要更新组件的state,然后根据新的 state 重新徐娜然用户界面(不要操作DOM). class Clock extends React.Component { construc ...

  4. windows版redis报错:本地计算机上的Redis服务启动后停止

    解决 1.如果需要临时启动Redis 使用命令:redis-server.exe   redis.windows.conf   --maxheap 200m 说明:200m是指定最大堆内存是200m, ...

  5. 【Android】Listview返回顶部,快速返回顶部的功能实现,详解代码。

    作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先给大家看一下我们今天这个最终实现 ...

  6. Visual Studio Installer闪退问题解决方法

    Visual Studio 2019安装推荐的方式是通过官方给的Installer进行的(2017也是同样方法),但是有时会出现在”即将完成…一切即将准备就绪“这个界面闪退的问题,导致软件的安装.卸载 ...

  7. 持续部署入门:基于 Kubernetes 实现滚动发布

    前言 软件世界比以往任何时候都更快.为了保持竞争力,需要尽快推出新的软件版本,而不会中断活跃用户访问,影响用户体验.越来越多企业已将其应用迁移到 Kubernetes. 在 Kubernetes 中有 ...

  8. SpringBoot—整合log4j2入门和log4j2.xml配置详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言   对于一个线上程序或者服务而言,重要的是要有日志输出,这样才能方便运维.而日志的输出需要有一定的规划,如日志命名.日志大小,日志分 ...

  9. flume读取日志文件并存储到HDFS

    配置hadoop环境 配置flume环境 配置flume文件 D:\Soft\apache-flume-1.8.0-bin\conf 将 flume-conf.properties.template ...

  10. 一个SQL查询连续三天的流量100以上的数据值【SQql Server】

    题目 有一个商场,每日人流量信息被记录在这三列信息中:序号 (id).日期 (date). 人流量 (people).请编写一个查询语句,找出高峰期时段,要求连续三天及以上,并且每天人流量均不少于10 ...