项目目录介绍
  • 目录结构如下:
    (包含:驱动的基础配置、全局异常处理、异常截图、报告自动生成、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配置,而是通过封装方法进行配置)
/*** 测试用例总入口* */@Testpublic 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. JAVA版APP社交移动电商系统+短视频+直播+线下店+营销活动+社交支持二开

    多商户功能清单 平台前台功能 模块   功能 前端 登录 小程序登录 通过用户授权自动获取微信头像.昵称 APP登录 1.通过手机号配合短信验证码的方式注册账号 2.通过给绑定的手机号发送验证码配合修 ...

  2. java版app微信支付服务端代码【手机app微信支付】

    老早就像做支付模块的东西,因为觉得很高大上,很早就开始把微信支付模块的重心签名给做好了,一直就缺个商家的key,现在有幸来电商公司,哈哈,果然一切很顺利,能够很给力地App端提供支持: 个人觉得核心部 ...

  3. 一种很轻松的Excel关键字方式进行Android端APP自动化测试(Java+Appium+TestNG+Excel)

    说明 本次分享Android端APP自动化测试Excel执行逻辑,整体逻辑与Web端类似,没看过的读者可看这里 =========>> 一种很轻松的Excel关键字方式进行网页Web自动化 ...

  4. 设计自己的基于Selenium 的自动化测试框架-Java版(3) - 给框架分分层

    设计自己的基于Selenium 的自动化测试框架-Java版(3) - 给框架分分层 给我们的框架分为3层,分别是叫逻辑层,数据层,对象层. 这三层的存储格式都用xml来表示. 1.逻辑层 (test ...

  5. 设计自己的基于Selenium 的自动化测试框架-Java版(2) - 定义自己的工作流程

    设计自己的基于Selenium的自动化测试框架-Java版(2) -定义自己的工作流程 Work flow chart 上图是整个工作流程,红色虚线上面的需要手动来完成,红色虚线下面的实现自动化. 我 ...

  6. OFCMS 模板开发手册 java 版cms系统

    一.模板说明 项目概述 java 版CMS系统.基于java技术研发的内容管理系统.功能:栏目模板自定义.内容模型自定义.多个站点管理.在线模板页面编辑等功能.代码完全开源.MIT授权协议. 技术选型 ...

  7. 公众号推送模板消息(JAVA版)

    公众号推送模板消息(JAVA版) 先贴上官方文档 步骤不多:组装请求体,调用接口 接口:(POST)https://api.weixin.qq.com/cgi-bin/message/template ...

  8. Java西西软件_随身java学习软件-随身Java清爽版app下载v1.1.2安卓无广告版-西西软件下载...

    随身Java清爽版app是一款非常适合初学者和有一定的开发经验的开发者使用Java技术学习应用,随身Java精选了在Java基础.JavaEE.数据库.面试等过程中经常遇到的知识点,覆盖面广.适用于初 ...

  9. QN模块java下载_QN卡片版app下载-QN卡片版下载v35 安卓版-西西软件下载

    QN卡片版app让你能够自己进行应用转生并完成Xposed框架的安装,从而让你能够更为深度的优化手机中的各种主题系统,让你的手机美化更出色,喜欢的朋友们赶快下载QN卡片版开始体验吧! QN卡片版软件介 ...

最新文章

  1. 计算机网络第五章:运输层
  2. python 函数复习
  3. 聊聊风口上的 eBPF
  4. python面向过程是基于面向对象的_Python5.1-面向对象与面向过程
  5. ASP.NET使用数据库存储、读取并修改图片
  6. [Err] 1231 - Variable 'sql_mode' can't be set to the value of 'NULL
  7. python库测试记录(sys、time、datetime、random、hashlib)
  8. opencv 4计算机视觉项目实战_资源|计算机视觉实战操作(PDF下载)
  9. c++和java哪个难_为什么说C语言比Java难?
  10. javascript笔记——图片大小检测
  11. mac上键盘说明以及intellij 快捷键的使用
  12. LeetCode:累加数【306】
  13. excel如何从字符串中截取指定字符(LEFT、RIGHR、MID三大函数)
  14. 【C语言】模块化编程-通俗易懂
  15. oracle18c 配置,0报错!Oracle 18C 完全安装指南及常见问题汇总
  16. 千千静听界面模拟(C#)
  17. 【在野利用】Apple Mail多个严重漏洞在野利用通告
  18. FineBI教程之入门例子
  19. 国民技术 MCU JLink仿真调试环境配置
  20. 微信小程序实现星星评分

热门文章

  1. 要从Java往数据库某个表中插入100万行数据,要求速度尽量快,方案和优化思路?
  2. IFRS14新收入准则:合同资产 、合同负债
  3. CPen绘制线条宽度大于1 的虚线
  4. 华为IOT平台温度过高时自动关闭设备场景试用
  5. Tableau学习Step6一如何制作炫彩地图
  6. C#控件CheckListBox的使用
  7. kali安装搜狗输入法
  8. Windows Vista MSDN简体中文版(32bit)
  9. 试用国内及国外AI绘图软件后的总结
  10. gentoo linux图形界面,Gentoo桌面系统的安装