背景

自动化是为业务测试服务,如果数据与业务放在一起看起来不是专业,把数据与业务分离是完全必要的,这也是市场常见的数据驱动框架,今天咱们就聊一聊怎么搭建自己数据驱动框架。

前置条件

Appium 环境搭建成功,不会参考自动化工具之 Appium 入门文章,实在不会在参考网上怎么搭建。

主要实

UI 自动化框架元素放文本存储、数据存储、代码直接存储等其实随便那个都行,只有自己用者方便就行,我工作中用文本文件存储,这样修改方便,脚本放 SVN/Git 管理就行,UI 自动元素操作基本常见的就是 ID/NAME/XPATH 等这几种,咱们写一个工具转换类即可。

元素读取工具类

/*** 移动端元素定位** @return* @param: name*/public By getLocatorApp(String name) {String locator = properties.getProperty(name.trim());String locatorType = locator.split(">>")[0].toLowerCase();String locatorValue = locator.split(">>")[1];if (locatorType != null && locatorType != null) {logger.info("获取元素key: " + name + "\t 获取的定位类型:" + locatorType + "\t 获取的定位表达式: " + locatorValue);// 根据 locatorType 的变量值内容判断,返回何种定位方式的 By 对象return getkeyVule(locatorType, locatorValue);} else {new RuntimeException("元素没有获取到!");return null;}}/*** 读取元素* @param locatorType* @param locatorValue* @return By*/public By getkeyVule(String locatorType, String locatorValue) {if ("id".equals(locatorType.toLowerCase())) {return By.id(locatorValue);} else if ("name".equals(locatorType.toLowerCase())) {return By.name(locatorValue);} else if (("classname".equals(locatorType.toLowerCase())) || ("class".equals(locatorType.toLowerCase()))) {return By.className(locatorValue);} else if (("tagname".equals(locatorType.toLowerCase())) || ("tag".equals(locatorType.toLowerCase()))) {return By.className(locatorValue);} else if (("linktext".equals(locatorType.toLowerCase())) || ("link".equals(locatorType.toLowerCase()))) {return By.linkText(locatorValue);} else if ("partiallinktext".equals(locatorType.toLowerCase())) {return By.partialLinkText(locatorValue);} else if (("cssselector".equals(locatorType.toLowerCase())) || ("css".equals(locatorType.toLowerCase()))) {return By.cssSelector(locatorValue);} else if ("xpath".equals(locatorType.toLowerCase())) {return By.xpath(locatorValue);} else {return By.tagName(locatorValue);}}
复制代码

读取文件操作方法

    public GetByLocator(String filename) {properties = new Properties();try {FileInputStream in = new FileInputStream((sysProperty.getProperty("user.dir") + "/comsevenday/src/main/resources/uiElement/" + filename));this.properties.load(in);in.close();} catch (Exception e) {logger.info("找不到文件:" + filename);e.printStackTrace();}}
复制代码

编写元素存放位置:

内容为:

#\u70B9\u51FB\u9996\u9875
clickCart=xpath>>//android.view.View[@content-desc='\u9996\u9875']
复制代码

编写测试类

    @Testpublic void ss() throws IOException {InputStream in = this.getClass().getResourceAsStream("/uielement/loginElement.properties");Properties properties = new Properties();properties.load(in);String to_shop_text1 = properties.getProperty("clickCart");System.out.println(to_shop_text1);}
复制代码

验证结果:

元素等待查找工具类

import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Reporter;/*** @author 7DGroup* @Title: WaitUtil* @Description: 等待查找元素工具类* @date 2019/11/23 / 10:58*/public class WaitUtil {public static void waitWebElement(AndroidDriver<AndroidElement> driver, By by, String name) {LogUtil.info("等待元素出现-->目前操步骤为:" + name);Reporter.log("目前操步骤为:" + name);WebDriverWait wait = new WebDriverWait(driver, 10);wait.until(ExpectedConditions.presenceOfElementLocated(by));}
}
复制代码

元素定位类

package appout.appcase.data;import appout.utils.GetByLocator;
import appout.utils.LogUtil;
import appout.utils.WaitUtil;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.Assert;import java.util.List;/*** @author 7DGroup* @Title: CartProvider* @Description: this is* @date 2019/11/23 / 10:57*/public class CartProvider {private GetByLocator getByLocator;private WebElement element = null;/*** 构造函数*/public CartProvider() {this.getByLocator = new GetByLocator("loginElement.properties");}/*** 点击首页*/public void clickHome(AndroidDriver<AndroidElement> driver) {WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("clickCart"), "点击首页");element = driver.findElement(getByLocator.getLocatorApp("clickCart"));element.click();}/*** 点击百宝箱** @param driver*/public void clickbaibao(AndroidDriver<AndroidElement> driver) {WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("clickCart"), "百宝箱");String[] name = {"京东超市", "数码电器", "京东服饰", "京东生鲜"};for (int i = 0; i < name.length; i++) {element = driver.findElement(getByLocator.getLocatorApp("Jingdong_supermarket".replace("京东超市", name[i])));element.click();//断言assertTrue(driver, "assertTitile", name[i] + "跳转成功");//退回WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("home_back"), "退回");driver.findElement(getByLocator.getLocatorApp("home_back"));}}/*** 分类写法** @param driver*/public void categorylist(AndroidDriver<AndroidElement> driver) {WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("categorylist"), "遍历分类");//获取全部数据挨个遍历List<AndroidElement> categorylist = driver.findElements(getByLocator.getLocatorApp("categorylist"));for (int i = 0; i < categorylist.size(); i++) {String text = categorylist.get(i).getText();//输出遍历nameLogUtil.info(text);categorylist.get(i).click();}}/*** 收藏** @param driver*/public void productdetail(AndroidDriver<AndroidElement> driver) {WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("productdetail"), "收藏");AndroidElement detail = driver.findElement(getByLocator.getLocatorApp("productdetail"));String attribute = detail.getAttribute("selected");if (attribute.equals(true)) {LogUtil.info("目前商品收藏,目前的属性为:" + attribute);} else {LogUtil.info("商品没有收藏,目前的属性为:" + attribute);}}/*** 统一判断是否通过** @param driver 传driver* @param elemn  定元素* @param des    描述*/public void assertTrue(AndroidDriver<AndroidElement> driver, String elemn, String des) {WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp(elemn), des);element = driver.findElement(getByLocator.getLocatorApp(elemn));String text = element.getText();if (text != null) {Assert.assertTrue(true, des + "验证成功");} else {//如果失败系统会自动截图Assert.fail("跳转失败");}}
}//     Assert.assertTrue("", "验证跳转成功");
//            driver.findElement(By.id(""))复制代码

基础启动类

package appout.appcase;import appout.base.DriverBase;
import appout.utils.LogUtil;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import org.openqa.selenium.By;
import org.testng.Reporter;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;import java.util.concurrent.TimeUnit;/*** @author 7DGroup* @Title: LoginTest* @Description: 用例区域* @date 2019/11/21 / 10:06*/public class BestRuner {static AndroidDriver<AndroidElement> driver;public static AndroidDriver<AndroidElement> getDriver() {return driver;}/*** 初始化运行类** @param udid* @param port* @throws Exception*/@BeforeClass@Parameters({"udid", "port"})public void BeforeClass(String udid, String port) {Reporter.log("步骤1:启动appium与应用", true);LogUtil.info("---这是设备ID号-->" + udid);LogUtil.info("--这是运行端口--->" + port);//通过路径获取包名与APP_ACTIVITYString apk = "com.jingdong.app.mall_70502.apk";driver = DriverBase.initDriver(port, udid, apk, true);driver.manage().timeouts().implicitlyWait(80, TimeUnit.SECONDS);}@Test(description = "初始化登录启动", testName = "进入首页", priority = 0)public void T001() {LogUtil.info("启动");driver.findElement(By.id("com.jingdong.app.mall:id/mj")).click();}}
复制代码

业务组合测试类

package appout.appcase;import appout.appcase.data.CartProvider;
import org.testng.annotations.Test;/*** @author 7DGroup* @Title: CartTest* @Description: 测试类 extends BestRuner* @date 2019/11/23 / 19:57*/public class CartTest  {CartProvider cartProvider = new CartProvider();@Test(description = "点击首页百宝箱", testName = "点击百宝箱", priority = 1)public void T002() {
//        cartProvider.clickHome(driver);
//        cartProvider.clickbaibao(driver);System.out.println("调试");}}复制代码

其他测试类集成,即可

总结

项目虽然小但包含了数据怎么存放,怎么获取,怎么换回成 selenium 识别的类型。

本文源码:

移动端自动化测试 Appium 框架之数据驱动相关推荐

  1. 移动端自动化测试appium(6)--搭建模拟器和真机环境

    模拟器–安装Android Studio及Android SDK 推荐直接安装Android Studio,然后使用Android Studio安装SDK. 启动SDK Manager,安装自己所需要 ...

  2. app自动化测试appium教程之三——appium基础命令(python)

    app自动化测试教程之三--appium基础命令(python) hello appium 基础操作API 教学视频参考b站课程,此文为学习记录 (免费的羊毛,要薅呀,筒子们~) 零基础入门移动自动化 ...

  3. app自动化测试appium教程之二——adb命令

    adb命令 ADB简介 获取包名和界面名 文件传输 获取app启动时间 获取手机日志[应用] 其他adb命令 教学视频参考b站课程,此文为学习记录 (免费的羊毛,要薅呀,筒子们~) 零基础入门移动自动 ...

  4. Web端与App端自动化测试框架

    Web端与App端自动化测试框架 一.Web端与App端的区别 想了解Web端与App端自动化测试框架的区别 ,那么我们就要先来了解Web和App的区别.Web项目一般都是B/S架构,基于浏览器的,而 ...

  5. 自动化测试---移动端自动化测试项目搭建(Appium+IDEA)

    自动化测试---移动端自动化测试项目搭建(Appium+IDEA) 模拟器+Appium操作 IDEA项目搭建 模拟器+Appium操作 首先打开黑窗口 输入命令 注:具体命令可看上一篇博客 第一步从 ...

  6. ui自动化测试框架_数据驱动 vs 关键字驱动:对搭建UI自动化测试框架的探索

    谢谢打开这篇文章的每个你 关注我们 点击右上角 ··· 设为星标 UI自动化测试用例剖析 让我们先从分析一端自动化测试案例的代码开始我们的旅程.以下是我之前写的一个自动化测试的小Demo.这个Demo ...

  7. 移动端自动化测试工具 Appium 快速入门

    文章目录 一.前言 二.Appium 概述 1.架构图 2.UI 自动化收益 三.环境安装 1.桌面版本安装 2.DOS命令安装 3.安装SDK 四.常用操作方法 五.常见定位方式 1.ID 定位 2 ...

  8. Python + Appium框架原生代码实现App自动化测试

    Step1:首先介绍下python+appium的框架结构 如下截图所示 (1):apk目录主要放置待测app的apk资源: (2):config目录主要放置配置文件信息,包含:数据库连接配置.UI自 ...

  9. AI考拉技术分享会—手把手教你入门UI 自动化测试 Appium

    2019独角兽企业重金招聘Python工程师标准>>> AI考拉日常技术分享会,前有众多前后端以及android大神分享,这次测试老司机Eric也放招,手把手带devs入门UI自动化 ...

最新文章

  1. C++中return语句的用法
  2. Python练习 | Python之图像的基本操作和处理
  3. 【考研】2022温州大学计算机学硕招收调剂
  4. 1746: 多项式系数(杨辉三角的应用)
  5. 怎么在linux操作python_pythonlinux怎么操作
  6. Linux OpenGL 实践篇-2 创建一个窗口
  7. c调用python第三方库_Python使用ctypes模块调用DLL函数之C语言数组与numpy数组传递...
  8. 服务器采用虚拟化应用漂移,虚拟化技术在数字化医院建设中的应用
  9. POJ3728 THE MERCHANT LCA RMQ DP
  10. linux中,一个目录的权限是777,普通用户为什么删除不了它呢?
  11. 没登录的计算机怎么远程桌面,没有远程登陆工具如何远程电脑 如何用向日葵实现远程登陆?...
  12. OneAPIConnect(一) 欧姆龙FINS协议实现源代码
  13. 存储卡格式化后数据如何恢复呢?
  14. moment.js 中文API
  15. c语言辅音字符怎么表示,C 语言实例 - 判断元音/辅音
  16. PayPal开发文档整理(8)——PayPal支付产品和解决方案
  17. 计算机二级易错知识点 2021 8.8
  18. [小程序]两数比较(5种写法)
  19. Rancher极简service mesh产品Rio安装试玩(基于k3s)
  20. App Store 3月下载量下滑

热门文章

  1. mysql加锁处理分析_MySQL 加锁处理分析 ---非常牛逼
  2. R语言可视化分面图、假设检验分组t检验、可视化单变量分组分面箱图(faceting bar plot)、添加误差条(error bar)、添加p值、添加抖动数据点(jitter points)
  3. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(分组调色板填充、自定义调色板、灰度比例)实战(dot plot)
  4. R语言ggplot2可视化配置多个子图中的相同分组使用相同的填充色实战
  5. R语言Hosmer-Lemeshow检验得到校准曲线的P值实战
  6. 李迅雷+但斌+趋势的力量+对话PPT
  7. 可视化LassoCV的最佳alpha值
  8. python 存redis失败无提示_Python Redis日志错误
  9. matlab中的single是什么类型_MATLAB 中cell数据类型的使用方法
  10. Webinar: An introduction to PacBio’s long-read sequencing how it has been used to make important s