Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用。“移动原生应用”是指那些用 iOS SDK 或者 Android SDK 写的应用。所谓的“移动web 应用”是指使用移动浏览器访问的应用(Appium 支持 iOS 上的 Safari 和 Android 上的 Chrome)。所谓的“混合应用”是指原生代码封装网页视图——原生代码和 web 内容交互。Appium既能在window安装也能在mac上安装,但是wind上只能跑安卓设备,Mac上能跑安卓与IOS两个设备。
Guihub:You can write tests with your favorite dev tools using any WebDriver-compatible language such as Java, Objective-C, JavaScript (Node), PHP, Python, Ruby, C#, Clojure, or Perl with the Selenium WebDriver API and language-specific client libraries.
来自网络
任何UI自动测试都不能完部替代人工测试,收益率高不高看部门怎么使用任何工具使用都是两方看怎么使用,如果有重复的工作每次需要人工去回归,建议使用自动化去回归,部门大家都用自动使用,会让大家的心信提高因为每次都机会使用自己写的脚本去验证自己重复工作。
脚本维护成本真的高吗?大家都说成本高,自己是否真的维护过,写过脚本?如果没有写过,没有维护过,没有发言权。只有自己用了才知道是否高。
今天咱们使用windos搭建appium自动化,使用java语言做脚本语言,内容会简单介绍安装,定位,使用还有简单框架跑起来,为了节约大家时间先告诉大家本文文章主要内容是什么,这样方便是否选择看下去。希望对没有做自动化的一点启示。
打开下面链接选择版本为exe进行下载:
下载安装后
点击启动:
DOS命令安装
下载:
配置环境变量:如果不会配置自己百度查询桌面配置
JAVA_HOME:
java -version验证:
配置环境变量:
npm install -g appium
如果上面下载比较慢可以使用如下命名:
appium-doctor
注意:如果上面环境没有配置,请百度自己查询
点击
输入
清除
长按
滑动
最简单的下滑命令行:
uuid表示手机设备号
/**
* 滑动方法
*
* @param driver
* @param direction up、down、left、right
*/
public static void swipe(AndroidDriver<AndroidElement> driver, String direction) {
case "up":
SwipeUp(driver);
break;
case "down":
SwipeDown(driver);
break;
case "left":
SwipeLeft(driver);
break;
case "right":
SwipeRight(driver);
break;
default:
break;
}
}
/**
* 上滑
*
* @param driver
*/
public static void SwipeUp(AndroidDriver<AndroidElement> driver) {
try {
} catch (InterruptedException e) {
}
.perform();
}
/**
* 下滑
*
* @param driver
*/
public static void SwipeDown(AndroidDriver<AndroidElement> driver) {
try {
} catch (InterruptedException e) {
}
new TouchAction(driver)
}
/**
* 左滑
*
* @param driver
*/
public static void SwipeLeft(AndroidDriver<AndroidElement> driver) {
try {
} catch (InterruptedException e) {
}
new TouchAction(driver)
}
/**
* 右滑
*
* @param driver
*/
public static void SwipeRight(AndroidDriver<AndroidElement> driver) {
try {
} catch (InterruptedException e) {
}
.perform();
}
获取属性
获取文本
获取资源
元素定位
打开:
在操作上面之前需要链接手机或者链接模拟器并操作命令显示:adb devices
如果是模拟器需要先链接:adb connect 127.0.0.1:62001这样再次链接
模拟器链接显示:
链接成功显示:
上面操作说明:
鼠标点击某个控件就会提示该控件可操作的相应内容:
说明:
其实在做移动端自动化测试,定位方式很少基本就是id/name/xpath/坐标等定位方式:
目前这中方式是可以定位h5页面操作
启动:
再弹出对话中输入:
在下面选项框中输入:
需要获取appPackage与appActivity
使用命令:
获取结果:
点击启动
显示正在启动
启动完毕显示:
启动完毕,剩下的就是常用与其他操作一样
简单java->demo
/**
* @author liwen
* @Title: Bases
* @Description: 安装初始化类
*/
public class DriverBase {
public static AndroidDriver<AndroidElement> driver;
/**
* @param port :服务器启动的端口号,系统自动获取
* @param udid :手机设备号:系统自动化获取
* @param apk :自动化运行的APK包,系统会根据该地址获取包名与actiber
* @param flag :true 卸掉有重新安装与运行后自动化卸掉包。false 直接安装运行
* @return
*/
public static AndroidDriver<AndroidElement> initDriver(String port, String udid, String apk, boolean flag) {
DesiredCapabilities caps = new DesiredCapabilities();
//自动安装
if (flag) {
//结束后会卸载程序
}
//PLATFORM_NAME: 平台名称
// UDID:设置操作手机的唯一标识,android手机可以通过adb devices查看
//NEW_COMMAND_TIMEOUT: appium server和脚本之间的 session超时时间
//APP_PACKAG:Android应用的包名
//APP_ACTIVITY :启动app的起始activity
//UNICODE_KEYBOARD:1、中文输入不支持,2、不用它键盘会弹出来,说不定会影响下一步操作.需要注意设置后,需要将手机的输入法进行修改
//Reset_KEYBOARD:是否重置输入法
//NO_SIGN:跳过检查和对应用进行 debug 签名的
try {
//appium测试服务的地址
driver = new AndroidDriver<>(new URL(serverUrl + ":" + port + "/wd/hub"), caps);
} catch (MalformedURLException e) {
}
return driver;
}
}
/**
* @author liwen
* @Title: AndroidCapabilityType
* @Description:功能配置类
*/
public class AndroidCapabilityType {
private AndroidCapabilityType() {
}
public static final boolean NO_SIGN = true;
public static final boolean UNICODE_KEY_BOARD = true;
public static final boolean RESET_KEY_BOARD = true;
/**
* waitElement 时的最长等待时间
*/
public static final String NEW_COMMAND_TIMEOUT = "600";
public static final String PLATFORM_NAME = "Android";
public static final boolean FULL_RESET = true;
/**
* 向上小滑动一步
*/
public static final String APP_UP_SWIPE = "adb shell input touchscreen swipe 400 800 400 300";
public static final String APP_GET_PACK_ACTIVITY = "aapt d badging pathapk |findstr \"package launchable-activity\"";
/**
* 重启应用
*/
public static final String RESTAPK = "adb -s 127.0.0.1 shell am start -n WelcomeActivityPama";
/**adb*/
/**
* 根据包名得到进程
*/
public static final String GETAPPPACKAGEPID = "adb shell ps | grep ";
/**
* 打开指定app
*/
public static final String OPEN_APP = "shell am start -n packagename activity";
/**
* 本地存储截屏图片的目录,(注意配置时的格式)
*/
public static final String LOCAL_SCREEN_FILE_URL = getpathlocal();
/**
* 获取目录工程路径
*
* @return
*/
public static String getpathlocal() {
File f = new File("");
File file = new File(logpath);
}
}
/**
* 本地存储截屏图片的格式
*/
public static final String LOCAL_SCREEN_FILE_FORMAT = ".png";
部分代码(如果需要请再群@)
/**
* @author liwen
* @Title: ReporterListener
* @Description: 自定义报告监听类
*/
public class ReporterListener implements IReporter, ITestListener {
private static final NumberFormat DURATION_FORMAT = new DecimalFormat("#0.000");
@Override
public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
List<ITestResult> list = new LinkedList<>();
Date startDate = new Date();
Date endDate = new Date();
int TOTAL = 0;
int SUCCESS = 1;
int FAILED = 0;
int ERROR = 0;
int SKIPPED = 0;
for (ISuite suite : suites) {
if (endDate == null) {
} else {
}
}
}
/* 计算总数 */
TOTAL = SUCCESS + FAILED + SKIPPED + ERROR;
VelocityContext context = new VelocityContext();
write(context, outputDirectory);
}
/**
* 输出模板
*
* @param context
* @param outputDirectory
*/
private void write(VelocityContext context, String outputDirectory) {
if (!new File(outputDirectory).exists()) {
new File(outputDirectory).mkdirs();
}
//获取报告模板
File f = new File("");
String fileDir = absolutePath + "/template/";
File outfile = new File(reslutpath);
}
try {
//写文件
VelocityEngine ve = new VelocityEngine();
Properties p = new Properties();
//输出结果
OutputStream out = new FileOutputStream(new File(reslutpath));
// 转换输出
} catch (IOException e) {
}
}
/**
* 排序规则
*
* @param list
*/
private void sort(List<ITestResult> list) {
@Override
public int compare(ITestResult r1, ITestResult r2) {
return 1;
} else {
return -1;
}
}
});
}
部分代码
static AndroidDriver<AndroidElement> driver;
/**
* 初始化运行类
*
* @param udid
* @param port
* @throws Exception
*/
@BeforeClass
@Parameters({"udid", "port"})
public void BeforeClass(String udid, String port) {
//通过路径获取包名与APP_ACTIVITY
}
@Test
public void T001() {
}
使用xml启动
命令号启动:
这样跑xml就能得到如下结果。
效果
log弹出
注意:
如果在启动的时候有问题,自己微调下。
使用maven建立项目,通过tesng做测试类与传参,以上简单介绍了环境部署,定位方式,启动类,报告类等方法。
在实际工作中这些远远是不够,但对与入门做参考和基础工程框架还是可以参考,如果想在运行测试类的时直接启动服务端需要参考命名怎么启动:可以参考博客;有命令,就可以通过上面介绍的dos工具类启动服务端。
不足点:本次只是安卓端没有介绍H5怎么测试怎么定位,IOS怎么部署。
2025年AI自动化测试平台深度评测:技术变革下的质量保障新范式
为 UI 页面写测试用例时(比如 web 页面,移动端页面),测试用例会存在大量元素和操作细节。当 UI 变化时,测试用例也要跟着变化, PageObject 很好的解决了这个问题。使用 UI 自动化测试工具时(包括 selenium,appium 等),如果无统一模式进行规范,随着用例的增多会变得难以维护,而 PageObject 让自动化脚本井然有序,将 page 单独维护并封装细节,可以使
在移动互联网用户突破65亿的今天,应用开发技术正经历从"平台割裂"到"融合创新"的范式转变。本文从底层架构、开发范式和生态竞争三个维度,解析Android、iOS与跨平台框架的技术特性与协同创新路径。一、平台原生开发:性能与生态的双重博弈1.1 核心架构对比平台运行时环境内存管理机制调试工具性能优化关键点AndroidART
## Android自动化测试平台随着移动互联网的快速发展,Android系统已经成为人们生活中不可或缺的一部分。为了确保Android应用程序的质量和稳定性,开发人员需要进行各种测试,其中自动化测试是一种高效且可靠的方法。在Android自动化测试中,一个重要的工具就是自动化测试平台。### 什么是Android自动化测试平台?Android自动化测试平台是一种软件工具,用于执行自动
在软件开发过程中,接口自动化测试是一个非常重要的环节。Kubernetes(简称K8S)是一种用于自动化部署、扩展和管理容器化应用程序的开源平台。接口自动化测试平台的开源方案可以帮助我们更好地测试和验证K8S集群中的接口,保证系统的稳定性和性能。在本文中,我将向你介绍如何实现接口自动化测试平台的开源方案。首先,让我们来列出实现接口自动化测试平台开源的整个流程,并用表格展示每个步骤所需做的事情:
# 自动化测试平台开源Python实现指南在当今软件开发中,自动化测试是提高开发效率和软件质量的重要环节。对于初学者来说,理解如何搭建一个基于Python的自动化测试平台是非常有用的。本文将为你详细介绍实现这一目标的流程和具体步骤。## 流程概览下面是实现自动化测试平台的主要步骤。| 步骤 | 描述 ||---
RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块,覆盖了整个产品测试周期。RunnerGo UI自动化基于Selenium浏览器自动化方案构建,内嵌高度可复用的测试脚本,测试团队无需复杂的代码编写即可开展低代码的自动化测试。以一条简单的搜索场景为例,本文介绍RunnerGo UI自动化的配置方法。通过百度搜索的场景步骤为:进入百度搜索页面-点击输入框-输
Java自动化测试平台的实战解析---Java自动化测试在现代软件开发中占据着重要的地位,凭借其强大的生态系统和丰富的库支持,开发者能够高效地进行测试工作,通过自动化的手段提高软件质量。以下是通过一系列步骤和结构,对“Java自动化测试平台”相关内容的深入分析和记录,希望能为后续的学习和实践提供参考。### 协议背景随着计算机网络的发展,协议的演变历程可以追溯到上世纪70年代。19
正文●选择尽可能少的自动化产品覆盖尽可能多的平台,以降低产品投资和团队的学习成本;●测试流程管理自动化通常应该优先考虑,以满足为企业测试团队提供流程管理支持的需求;●在投资有限的情况下,性能测试自动化产品将优先于功能测试自动化被考虑;●在考虑产品性价比的同时,应充分产品的支持服务和售后服务的完善性;●尽量选择趋于主流的产品,以便通过行业间甚至网络等方式获得更为广泛的经验和支持;●应对测试自
在如今开源的时代,我们就不要再闭门造车了,热烈的拥抱开源吧!本文针对性能测试、Web UI 测试、API 测试、数据库测试、接口测试、单元测试等方面,为大家整理了github或码云上优秀的自动化测试开源项目,希望能给大家带来一点帮助。一、性能自动化测试1、项目名称:基于Jmeter实现的在线压测平台和在线管理Jmeter脚本系统项目简介:本项目基于renren-fast Java开发平台开发,内核
自动化测试框架由一组最佳实践,通用工具和库组成,可帮助测试人员评估多个Web和移动应用的功能,安全性,可用性和可访问性。而在,软件开发世界中有很多的自动化测试框架,该如何选择?虽然技术团队可以构建复杂的自动化测试框架,但是当可以选择现有的开源工具,库和测试框架获时,则可以选择适合自己的框架,来节省开发成本和时间。在选择开源的自动化测试框架时,务必关注这些关键要素,比如可重用、易于维护、最少的人工干
附上...
背景工具选择架构设计及技术实现 参数设计 断言 持续集成 测试集编写总结 一、背景1.目前公司发展比较迅速,还处于不停堆业务阶段,所以迭代比较频繁,导致人工回归的成本越来越大2.在有限的测试资源情况下,开发自测的需求占比不低,后端频繁发布容易心里没底3.该平台主要使用用户是测试同学,编写接口用例不能有太多的代码量4.自动化是为了提高测试的效率,需要考虑投入产出比,维护
1. 什么是selenium?selenium 自动化测试浏览器,它主要是用于Web应用程序的自动化测试,但肯定不只局限于此,同时支持所有基于web的管理任务自动化。selenium 的特点:l 开源,免费l 多浏览器支持:FireFox、Chrome、IE、Operal 多平台支持:linux 、windows、MACl 多语言支持:j
自动化测试一般分为以下三类:1、基于代码的自动化测试(Code-Based)优点:易于实施和控制,容易快速看到效果,结合TDD将代码质量提高一个量级缺点:要求有较强的编码能力和对被测代码的理解,同事需要流程和团队的配合;需要开发大量的测试驱动程序和测试桩,让研发团队望而却步解决方案:多从灰盒测试角度实施(基于接口),而非纯北河测试角度(基于代码逻辑)2、基于界面的自动化测试(GUI-Based)优
上期为大家介绍了自动化测试的基本概念,方便大家对于自动化测试建立基础性的认识。随着今年自动化测试建设项目的落地,我行的自动化测试平台也应运而生,为我行在自动化测试领域的实践探索提供了工具支撑,下面我就为大家分享平台建设过程中的一些思考。01、平台建设思路目前自动化测试已经具备比较成熟的技术条件,市面上有大量的开源框架支持自动化测试的落地,但都需要一定的开发语言作为基础支撑。由于银行内部系统的多样性
在世面上的自动化测试工具很多。有开源的,有商业化的,各有各得特色,各有各得优点!下面我就介绍几个我用过的开源自动化测试工具。1 测试 WEBSELENIUM可以说是测试WEB最全面的开源自动化工具, 它可以在WINDOWS, LINUX, MAC 和 SOLARIS 上运行, 而且可以几乎用任何一种编程语言进行构建, 你可以用你熟悉的语言包括 JAVA, C#, PERL, PHP, P
你是否曾好奇过GPU(图形处理器)内部是如何工作的?面对动辄数千核心的现代GPU,想要深入理解其架构原理如同雾里看花。本文将通过剖析GitHub推荐项目精选 / ti / tiny-gpu这个开源项目,带你从最基础的Verilog实现出发,揭开GPU工作的神秘面纱,并探讨现代图形处理器的发展方向。读完本文,你将能够清晰了解GPU的核心架构组成、指令集设计、并行执行模型以及未来的技术演进趋势。#...
本文主要介绍了C++ STL中的关联式容器set和map,重点分析了它们的使用方法和特性。set是一种基于红黑树实现的有序集合,具有自动去重和排序功能,支持高效查找、插入和删除操作(O(logN))。map是键值对容器,同样基于红黑树实现,通过key快速查找value,支持[]运算符进行高效访问和修改。
随着数字化转型的深入,国内制造业产业转型升级的需求日渐升级,工业互联网作为新基建七大领域之一正迎来巨大的发展潜力。据工信部数据显示,截止今年第一季度,全国具有一定行业区域影响力的工业互联网平台已超过100个;2018-2020年,我国已支持125个工业互联网平台、项目金额近30亿。 在政策红利之外,作为互联网的下半场,工业互联网自是如同“香饽饽”被环视。近日,百度智能云在中国工业互联网高
前言vue父子组件之间通过props很容易的将父组件的值传递给子组件,如果一个组件嵌套很多层,每一层之间度需要同props进行传值,很麻烦,且不易维护。vue通过provide & inject两个关键字完成父组件向子孙组件直接传值,很像子类能够使用父类的属性一样方便。provide & inject一般用于多层之间的传值,两层之间还是使用props进行。示例【示例】A组件中使用了