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

    (包含:驱动的基础配置、全局异常处理、异常截图、报告自动生成、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. 防止用户利用PHP代码DOS造成用光网络带宽

    用PHP代码调用sockets,直接用服务器的网络攻击别的IP,常见代码如下: 代码如下:$packets = 0; $ip = $_GET[\'ip\']; $rand = $_GET[\'port ...

  2. 两台Windows Server 2012 R2数据库同步

    文件服务器/备库(192.168.0.1) 数据库服务器/备份文件服务器(192.168.0.2) 数据库实时同步 一.在主数据库服务器里,同样打开隐藏文件,找到C:\ProgramData\MySQ ...

  3. 总结java中创建并写文件的5种方式

    在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下面笔者就帮大家总结一下java中创建文件的五种方法. Files.newBufferedWriter(Java 8) Files. ...

  4. SICP之1.3中文翻译题目错误

    原版题目: Exercise 1.3: Define a procedure that takes three numbers as arguments and returns the sum of ...

  5. 【亲测】手把手教你如何破解pycharm(附安装包和破解文件)

    此教程支持最新的2019.3版本的Pycharm,并兼容之前的版本. 一.准备工作: 1.下载Pycharm 有条件的可以自行去官网下载,这里我提供了我下载的版本,已上传到百度网盘,链接在下方. 2. ...

  6. BM算法学习

    根据阮一峰大大的文章实现,不过没实现“搜索词中的上一次出现位置”(我直接实时查找,显然应该预处理): 文章:http://www.ruanyifeng.com/blog/2013/05/boyer-m ...

  7. zabbix-4.0-监控服务器的ping告警设置

    问题:一直在困惑如果一台服务器的网络发生故障或者断开时,怎么第一时间发现并去排查. 思路:利用zabbix平台监控服务器,监控ping这一项,设置一个报警,并使用脚本去提醒与通知,可使用邮件报警/短信 ...

  8. JavaWeb三大器(过滤器、拦截器、监听器)概念梳理

    最近工作碰到了一个问题:项目A需要收集项目B中的用户活跃数信息,最后通过HttpSessionAttributeListener实现.在开发过程中,网上查找了过滤器.拦截器.监听器的帖子,这里对自己收 ...

  9. Mybatis实例增删改查(二)

    创建实体类: package com.test.mybatis.bean; public class Employee { private Integer id; private String las ...

  10. 转载:SQL语句执行顺序

    转载地址:https://database.51cto.com/art/202001/609727.htm