App自动化测试 —— Appium的使用

2023-10-26

简介

Appium是一个开源测试自动化框架,用于原生、 混合和移动 Web 应用程序。

安装

Appium安装方式有两种,一种是通过npm命令行安装,另一种是通过安装可视化工具。

  • npm安装

    npm安装方式稍微麻烦一点,需要先安装npm才能进行操作,想了解的可参考:安装Appium

  • 可视化工具安装

    可视化工具的下载可前往Github下载

本文使用的是 可视化工具安装 方式。

配置 & Run

安装完成后启动Appium.exe,点击编辑配置

在这里插入图片描述
在弹出的配置界面中填写已提前配置好的环境变量路径并保存重新启动

在这里插入图片描述
重启后点击启动服务器

在这里插入图片描述
点击右上角的启动检查器会话

在这里插入图片描述
在这里插入图片描述
点击中间偏下方的 “ + ” 号添加参数

Capability Description
platformName 设备操作系统
platformVersion 设备操作系统版本
deviceName 设备名称(可通过执行adb的adb devies获取当前连接上的设备)
appPackage 应用程序包名
appActivity 从appPackage 中启动的 Android 活动的活动名称
noReset true or false,执行程序的同时是否清空app数据

更多Capability可参考:Appium Desired Capabilities

填写部分参数如下:

在这里插入图片描述
点击启动会话后弹出如下窗口:

在这里插入图片描述
Appium可以通过录制操作,生成JS、Java、Python、Ruby等程序可运行的语言。具体操作如:开始操作 → 点击app界面的某一个按钮或输入框 → 点击后会在右侧的 选定元素 中显示相关信息 → 选择 点击 或 发送密钥 的操作 → 刷新屏幕截图。

在这里插入图片描述
部分选择元素是无法选中的,需要使用坐标定位所点击位置。录制完相关操作,将录制生成的代码复制到剪贴板,粘贴至Android Studio 开发工具 @Test注解的方法里。

在这里插入图片描述
run 一下,自动化UI测试的操作步骤就完成了

在这里插入图片描述
Android Studio里面执行代码,应提前引入commons-lang3java-clientselenium-server-standalone三个jar包,下载地址在文章尾部。部分Java代码如下:

	@Before
    public void initAppium() {
        File classpathRoot = new File(System.getProperty("user.dir"));
        // 获取apps文件,前面测试应用所存放的目录
        File appDir = new File(classpathRoot, "/test_app/");
        // 获取apk文件
        File app = new File(appDir, "AppiumAutoTest.apk");
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("platformName", "测试的设备系统");
        capabilities.setCapability("platformVersion", "系统平台版本号");
        capabilities.setCapability("deviceName", "测试的设备名称");
        capabilities.setCapability("app", app.getAbsolutePath());
        capabilities.setCapability("appPackage", "被测应用包名");
        capabilities.setCapability("appActivity", "app启动的第一个运行界面");
        // 连接appium启动相应app
        try {
            driver = new AndroidDriver<>(new URL("http://192.168.31.98:4723/wd/hub"), capabilities);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        System.out.println("App is launched!");
    }

    @Test
    public void startTest() throws InterruptedException {
        MobileElement el3 = (MobileElement) driver.findElementByAccessibilityId("Reflow");
        el3.click();
        sleep(1000);
        MobileElement el4 = (MobileElement) driver.findElementByAccessibilityId("Slideshow");
        el4.click();
        sleep(1000);
        MobileElement el5 = (MobileElement) driver.findElementByXPath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/androidx.drawerlayout.widget.DrawerLayout/android.view.ViewGroup/android.widget.LinearLayout[2]/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.view.ViewGroup");
        el5.click();
        sleep(1000);
        execRootCmdSilent("adb shell input tap 958 1588");
        sleep(1000);
        MobileElement el6 = (MobileElement) driver.findElementByAccessibilityId("更多选项");
        el6.click();
        sleep(1000);
        MobileElement el7 = (MobileElement) driver.findElementById("com.miyue.appiumautotest:id/title");
        el7.click();
        sleep(1000);
        MobileElement el8 = (MobileElement) driver.findElementByAccessibilityId("转到上一层级");
        el8.click();
    }
    
	private void sleep(int second) throws InterruptedException {
        Thread.sleep(second);
    }

    /**
     * 使用adb命令执行点击的坐标点
     * @param paramString
     */
    public void execRootCmdSilent(String paramString) {
        String content = "";
        BufferedReader reader = null;
        InputStream is = null;
        try {
            java.lang.Process process = Runtime.getRuntime().exec(paramString);
            is = process.getInputStream();
            reader = new BufferedReader(new InputStreamReader(is));
            StringBuffer output = new StringBuffer();
            int read;
            char[] buffer = new char[4096];
            while ((read = reader.read(buffer)) > 0) {
                output.append(buffer, 0, read);
            }
            content = output.toString();
            System.out.println("App execution adb done!" + content);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("App issue!" + e.getMessage());
        } finally {
            if (null != is) {
                try {
                    is.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 运行完成
     * @throws InterruptedException
     */
    @After
    public void end() throws InterruptedException {
        // 退出应用
        driver.quit();
    }

问题 & 解决方案

  • no tasks available.

    原因:没有配置Run/Debug Configurations

  • Connection refused: connect.

    原因Appium服务未启动。

  • An unknown server-side error occurred while processing the command. Original error: Unable to find an active device or emulator with OS 11. The following are available: 6HJ4C19A29009173 (10).

    原因platformVersion 输入的操作系统与连接到的操作系统版本不对。

  • An unknown server-side error occurred while processing the command. Original error: Could not find a connected Android device in 20088ms.

    原因:未连接到测试设备,需要使用adb或数据线连接上设备,执行adb命令adb devices查看目前所连接到的设备,将设备名称拷贝粘贴至deviceName

  • 重新编写测试步骤的代码,应该提前clean运行缓存。

优点 & 缺点

优点

  • 支持第三方应用程序。
  • 支持同时测试多台设备。
  • 支持生成多种语言的测试代码。
  • 不需要把第三方代码编译进app中。
  • 解放了双手,避免了不必要的重复操作。
  • 支持IOS、Android、Windows的应用程序。
  • 支持Native apps、 Hybrid apps、Web apps。

缺点

  • 暂不支持可用于编写Android程序的Kotlin代码。
  • 相对于人工测试而言,Appium自动测试不太适合小规模的测试。

总结

噢,相信你体验之后肯定会刷新你对Appium的看法。

若测试的应用不需要进行多次重复性的UI测试,似乎没必要使用Appium自动化测试,与手动点击UI测试相比,速度慢的似乎不是一丁半点。

最近了解到一个叫AccessibilityService(无障碍服务)的东西,这玩意可以用来开发Application脚本,脚本执行速度那叫一个快。只可惜它不是一个自动化测试的框架,不然用来搞自动化测试应该很牛掰的吧。

本文Android Studio代码下载地址:Appium自动化测试的使用代码下载地址

参考资料

1、Appium官网
2、Appium下载地址
3、java-client.jar包下载地址
4、commons-lang3.jar包下载地址
5、Appium搭建Android自动化测试框架
6、selenium-server-standalone.jar包下载地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

App自动化测试 —— Appium的使用 的相关文章

  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 对于一个单元格,RecyclerView onBindViewHolder 调用次数过多

    我正在将 RecyclerView 与 GridLayoutManager 一起使用 对于网格中的每个项目 我需要调用 REST api 来检索数据 然后 从远程异步获取数据后 我使用 UIL 加载 显示图像 一切似乎都很好 但我发现 on
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

  • 怎么可以有颜色的将matlab的代码复制到word中不产生乱码。

    我们直接将matlab中的代码复制粘贴到word中 就会产生如图的乱码 如果选择选择只保留文本 也能解决乱码问题 但是会将matlab原带的代码颜色消失 显得不美观 其实只要改正一下字体就可以解决这种问题 在matlab中设置一下字体就可以
  • Tomcat控制台中文乱码问题

    解决方案 第一 只修改java util logging ConsoleHandler encoding UTF 8下的编码格式 修改成GBK 不成功看第二 我用第一个配置就成功了 第二 在Tomcat根目录下 conf 子目录下的 log
  • Daily Scrum: 2012/11/7

    成员 角色 今天工作 明天计划 王安然 PM Dev 进行Craft类的供给Craft子类的编写 186 继续进行Craft CraftFactory类的编写 186 黄杨 PM Dev Art 完成粒子爆炸效果测试 199 基本样式的星空
  • 前端JavaScript面试技巧

    前端JavaScript面试技巧 第一章 课程简介 1 1课程简介 前端基础 1 2前言 网站前端程序开发分析 1 3几个面试题 typeof操作符 require命令加载ES6模块 SpringLoaded 1 4如何搞定所有面试题 获取
  • 【力扣练习题】加一

    package sim import java math BigDecimal import java util Arrays public class Add1 给定一个由 整数 组成的 非空 数组所表示的非负整数 在该数的基础上加一 最
  • eclipse环境搭建C++环境

    eclipse搭建C 编译环境使用eclipse CDT msys gcc gdb共4个软件 其中几个软件简单理解为 eclipse CDT 用于编辑软件文本 msys 管理使用的软件下载 gcc 用于编译 链接文件 gdb 用于调试 一
  • graphpad7.04多组比较p值_同是折线图为何你却这么优秀,这才是多组数据作图应该有的样子...

    相信大家对Excel做折线图应该不陌生 在展示数据的时候 图表是一种最好的展示方法 但是经常会碰到一种尴尬的事情就是 当数据维多比较多的时候 做出的图表就会显得非常难看 今天我们就来学习一下 多组数据怎么做折线图才好看 平民手中的折线图 当
  • 读书笔记-oo项目生存法则

    1 建立一个成功的项目的简单四步 1 采用增量式进度安排和阶段划分 2 拥有发现和改正错误的机制 3 建立一个良好的产品发布习惯 4 拥有优秀的项目负责人 项目经理和技术主管 2 相关概念 1 类是一组子程序和相关数据的集合 常用类图表示
  • springboot+flowable+mybatisplus初始化建表时如何指定数据源

    springboot flowable mybatisplus初始化表单如何指定数据源 问题描述 解决过程 直接上代码 问题描述 之前在自己的springboot当中集成了flowable 在集成flowable之前 springboot当
  • 直方图均衡化

    https www zhihu com question 37204742 answer 221844779 https zhuanlan zhihu com p 32857009
  • 明文传输漏洞

    业务系统对用户口令等机密信息的保护不足 攻击者可以利用攻击工具 从网络上窃取合法用户的口令数据 从而登录系统执行非法操作 攻击者可以利用监听工具在网络中窃取合法用户的口令数据 从而非法获取系统的访问权限 检测方法 通过burpsuite工具
  • OD-数列还原(python)

    数列还原 题目描述 有一个数列A n 从A 0 开始每一项都是一个数字 数列中A n 1 都是A n 的描述 其中A 0 1 规则如下A 0 1A 1 11 含义其中A 0 1是1个1 即11 表示A 0 从左到右连续出现了1次1A 2 2
  • C语言/C++基础之跨年烟花程序代码(附源码)

    C语言 C 基础之跨年烟花程序代码 程序之美 前言 主体 运行效果 代码实例 结束语 程序之美 前言 元旦将至 新年将至 转眼间2022年即将过去 崭新的一年正向我们缓缓走来 风花雪夜新年临近 入冬寒意随风吹进 繁星点点缀满天际 黎明晨阳元
  • 修改jar包中的class文件

    需求及准备 需求 现在有一个 jar文件 要修改其中某个文件的代码 准备 确保JRE已安装且环境变量已配置 安装Java Decompiler 官方地址为 http java decompiler github io 选择其中的JD GUI
  • Spring循环依赖源码debug详解

    1 什么是循环依赖 在Spring里 指两个或多个bean互相依赖 比如有两个Bean A B A中注入B B中注入A 这样就形成了循环依赖 Spring默认是支持循环依赖的 本文我们就从Spring源码层面对循环依赖进行分析 2 环境构建
  • Node.js学习四(文件流stream)

    文章目录 前言 一 Node处理缓存的方式 二 什么是Node js Stream 流 三 stream 流 的类型 四 创建可读流 五 拷贝文件 六 链式流 1 压缩文件 2 解压文件 前言 在我们学过fs模块后 可以知道读取文件时采用r
  • 12 shell命令之打包

    昨晚写的awk 说实话 对我而言 那是一个最复杂的命令 写得不是很好 可能在结构组织上面有很大的问题 后续有心得会再调整修改 本文将介绍linux的一组打包命令 这其中有我们最常用的tar 也有我们几乎没有见过的mksquansh 接下来就
  • 简明SQL截断和偏移指南:掌握LIMIT实现数据筛选

    以下是用到的表 截断 LIMIT 用于限制查询结果返回的行数 即最多返回多少行数据 例如 返回前两行数据 例如 从第二个数据开始返回两条数据 从0开始计算 偏移 OFFSET 用于指定查询结果的起始位置 即从结果集中的第几行开始返回数据 例
  • Spring使用——通过配置类注入Bean

    配置类 Configuration 告诉spring这是一个配置类 ComponentScan value指定要扫描的包 Filter excludeFilters default 扫描的时候按照规则排除哪些 ComponentScan v
  • App自动化测试 —— Appium的使用

    目录 简介 安装 配置 Run 问题 解决方案 优点 缺点 总结 简介 Appium是一个开源测试自动化框架 用于原生 混合和移动 Web 应用程序 安装 Appium安装方式有两种 一种是通过npm命令行安装 另一种是通过安装可视化工具