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> ...
 
随机推荐
- zookeeper基本配置以及一些坑
			
配置 1. 解压安装包:tar zxvf zookeeper-3.4.14.tar.gz 2. 修改zookeeper配置: #Master cd zookeeper-3.4.14 #创建日志文件夹及 ...
 - [NOIP2018]保卫王国 题解
			
NOIP2018提高组D2T3 ddp虽然好想,但是码量有点大(其实是我不会),因此本文用倍增优化树形DP来解决本题. 题意分析 给一棵树染色,每个节点染色需要一定的花费,要求相邻两个节点至少要有一个 ...
 - [ASP.NET Core开发实战]基础篇05 服务器
			
什么是服务器 服务器指ASP.NET Core应用运行在操作系统上的载体,也叫Web服务器. Web服务器实现侦听HTTP请求,并以构建HttpContext的对象发送给ASP.NET Core应用. ...
 - 使用script打开页面
			
<script src="x" onerror=javascript:window.open("http://192.168.38.1/csrf.html" ...
 - playable
			
探索TimelinePlayableAPI,让Timeline为所欲为 https://blog.csdn.net/qq826364410/article/details/80534892 Playa ...
 - 【代码优化】Unity查漏补缺
			
1.XML: 使用Unity社区中的开源脚本(Js语言)解析XML文件,网址:http://dev.grumpyferret.com/unity/,已打包XMLParser.unitypackage, ...
 - 解决ASP.NET上传文件大小限制------(转载人家的博客很好用,略作修改)
			
解决ASP.NET上传文件大小限制 (2012-06-26 15:18:01) 转载▼ 标签: it 第一种方法,主要适用于IIS6.0版本 一.修改配置Web.Config文件中的httpRun ...
 - TP6.0多应用模式隐藏路由中的应用名
			
本文默认采用的是多应用模式 PHP技术群: 159789818 ThinkPHP技术群: 828567087 1. 多应用模式中隐藏路由中的应用名的三种方式 域名绑定应用 增加应用入口 入口文件绑定应 ...
 - Tomcat +Nginx+Redis实现session共享
			
一.准备工作 中间件:Tomcat.Redis.Nginx jar包:commons-pool2-2.4.2.jar.jedis-2.8.0.jar.tomcat-redis-session-mana ...
 - AD16
			
第三集 制作光敏小夜灯的原理图 1.点击G切换栅格的精度 2.元器件放置好之后要先布局在布线 3.布线完成后要检查电路的合理性.对应查一下电阻的个数,位置是不是符合.在原理上大概的估计是否可以. ...