教你用Appium搭建Android自动化测试框架(详细教程)

news2024/11/15 11:58:14

如题,本文附有仓库地址以及代码,目录如下:

1.下载安装appium

2.配置并使用appium

3.配置工程

一、下载安装appium

下载appium-desktop的mac版本,我选择用1.17.1版本,最新的版本1.22.0,拆分一个桌面应用为两个桌面应用了,一个叫做Appium Server,另外一个叫做AppiumInspector。

下载链接:github.com/appium/appi…

UI Automator,google提供的自动化测试框架,appium集成了它。详细了解如下:developer.android.google.cn/training/te…

二、配置并食用appium

a.电脑配置好adb,jdk,sdk环境变量,打开appium应用。

Host和端口不需要修改,点击start后页面如下,点击箭头位置,配置app的信息。

b.开始配置appium

c.涉及到的adb命令

adb devices -l
adb shell dumpsys activity | grep "mResume"
Json的信息,要根据具体的手机和要测试的app的信息进行配置,第一个矩形框为appPackage的内容,第二个矩形框为appActivity的内容,输入如下命令获得需要的信息;

adb shell dumpsys activity | grep "mResume"

输入如下命令,获得矩形框的内容,填充Json中的deviceName选项

adb devices -l

d.点击了start session后,正式进入了appium的使用,代表配置成功了,界面如下:

三、配置工程

a.点击录制

b.生成UI自动化的脚本

点击1-》界面控件-》2-》3,从而复制3中的脚本

c.通过AS新建一个工程

如Java工程,在maven-resposity下载三个依赖的jar包,在新建模块的libs目录下拷入 commons-lang3-3.1.jar 、java-client-7.3.0.jar、selenium-server-standalone-3.141.59.jar这三个jar库,build.gradle中配置依赖junit和jar包。

新建一个app的文件夹,然后复制对应要测试的apk到这个目录下面,主义,对应的apk一定要是testonly设置为false了,否则会发生错误,同时,手机在测试前,先卸载掉已经安装的测试应用,避免安装不上去;

d.最后,编写测试代码,作为普通的控制台程序进行执行,代码如下:

package com.mobile.searchandclick;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;

public class MyClass {

    private AndroidDriver<AndroidElement> driver;
    @Before
    public void init() {
        File classpathRoot = new File(System.getProperty("user.dir"));
        // 获取apps文件,前面测试应用所存放的目录
        File appDir = new File(classpathRoot, "/app/");
        // 获取apk文件
        File app = new File(appDir, "app.apk");
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("platformName","Android");
        // 系统平台版本
        capabilities.setCapability("platformVersion", "10");
        // 设备名,这里是模拟器的设备名
        capabilities.setCapability("deviceName", "ONEPLUS_A6000");
        capabilities.setCapability("app", app.getAbsolutePath());
        // 设置被测应用包名
        capabilities.setCapability("appPackage", "com.example.android.navigationsample");
        // app的入口启动activity
        capabilities.setCapability("appActivity", ".MainActivity");
        // 连接appium启动相应app
        try {
            driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        System.out.println("App is launched!");
    }
//    版权声明:本文为CSDN博主「鱼乐游溪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
//    原文链接:https://blog.csdn.net/yjf611/article/details/104470449

    @Test
    public void sampleTest() throws InterruptedException {
        Thread.sleep(2000);
        MobileElement el2 = (MobileElement) driver.findElementById("com.example.android.navigationsample:id/play_btn");
        el2.click();
        Thread.sleep(2000);
        MobileElement el3 = (MobileElement) driver.findElementById("com.example.android.navigationsample:id/username_text");
        el3.sendKeys("haha");
        Thread.sleep(2000);
        MobileElement el4 = (MobileElement) driver.findElementById("com.example.android.navigationsample:id/email_text");
        el4.sendKeys("123@qq.com");
        Thread.sleep(2000);
        MobileElement el5 = (MobileElement) driver.findElementById("com.example.android.navigationsample:id/password_text");
        el5.sendKeys("111");
        Thread.sleep(2000);
        MobileElement el6 = (MobileElement) driver.findElementById("com.example.android.navigationsample:id/signup_btn");
        el6.click();
        Thread.sleep(2000);
        MobileElement el7 = (MobileElement) driver.findElementById("com.example.android.navigationsample:id/play_btn3");
        el7.click();
        Thread.sleep(2000);
        MobileElement el8 = (MobileElement) driver.findElementById("com.example.android.navigationsample:id/checkBox");
        el8.click();
        Thread.sleep(2000);
        MobileElement el9 = (MobileElement) driver.findElementById("com.example.android.navigationsample:id/play_btn4");
        el9.click();
        Thread.sleep(2000);
        MobileElement el10 = (MobileElement) driver.findElementById("com.example.android.navigationsample:id/play_btn3");
        el10.click();
        Thread.sleep(2000);
        MobileElement el11 = (MobileElement) driver.findElementById("com.example.android.navigationsample:id/checkBox3");
        el11.click();
        Thread.sleep(2000);
        driver.navigate().back();
        Thread.sleep(2000);
        driver.navigate().back();
        Thread.sleep(2000);
        driver.navigate().back();
        Thread.sleep(2000);
        System.out.println("App is done!");
    }

    @After
    public void end() throws InterruptedException{
        driver.quit();
    }
}

项目的仓库地址如下:https://gitee.com/Greny/Appium


绵薄之力:免费分享配套资源

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

加入我的软件测试交流群:110685036免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

免费获取方式 :

ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÂ¥ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃèÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃèÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÿÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃéÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃæÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÂ¥ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÂ¥ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÂ¥ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃþÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃçÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃæÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃèÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÿÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃð

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/605720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k-means算法超级详解-转载

这是搬运的 一、 实验准备 1.1 实验概述 所谓聚类算法是指将一堆没有标签的数据自动划分成几类的方法&#xff0c;属于无监督学习方法&#xff0c;这个方法要保证同一类的数据有相似的特征。根据样本之间的距离或者说是相似性&#xff08;亲疏性&#xff09;&#xff0c;把越…

牛郎织女的幸福生活(活锁)

从前&#xff0c;有一对夫妻&#xff0c;男的叫牛郎&#xff0c;女的叫织女&#xff0c;他们很好地传承了中华民族的谦让美德&#xff0c;每次吃饭时都会优先考虑对方&#xff0c;如果对方饿的话&#xff0c;就让给对方吃&#xff0c;等对方吃饱了自己才吃&#xff0c;这种美德…

SpringBoot整合OSS文件上传

一、注册阿里云账号并开通OSS服务 1、登录阿里云账号 2、创建一个bucket 3、创建子用户 对自用户分配权限&#xff0c;打开操作OSS的全部权限&#xff08;也可根据业务需求进行更改&#xff09; 4、配置上传跨域规则 任何来源: *允许方法: POST任何请求头Headers: * 二、…

pytorch实现图像分类任务-手写数字识别(一)

Pytorch手写数字识别 Minst数据集介绍 Size: 2828 灰度手写数字图像 Num: 训练集 60000 和 测试集 10000&#xff0c;一共70000张图片 Classes: 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8&#xff0c;9 一…

pybullet学习(一)——安装与入门pybullet

PyBullet介绍 PyBullet 基于著名的开源物理引擎 bullet 开发&#xff0c;封装成了 Python 的一个模块&#xff0c;用于机器人仿真和学习。PyBullet 支持加载 URDF、SDF、MJCF 等多种机器人描述文件&#xff0c;并提供正/逆向运动学、正/逆向动力学、碰撞检测、射线相交查询等功…

FreeRTOS多任务系统

FreeRTOS 文章目录 FreeRTOS1 单任务和多任务系统1.1 单任务系统1.2 多任务系统 2 FreeRTOS 任务状态3 FreeRTOS 任务优先级4 Free RTOS 任务调度方式4.1 抢占式调度4.2 时间片调度 5 FreeRTOS 任务控制块6 FreeRTOS 任务栈 1 单任务和多任务系统 1.1 单任务系统 单任务系统的…

手把手教你搭建网站(零基础,不用写代码)

没有前言直接开始正文&#xff0c;搭建一个博客需要服务器&#xff0c;域名&#xff0c;博客程序。 博客程序常用的有wordpress&#xff0c;z-blog&#xff0c;typecho等等&#xff0c;其中wordpress和z-blog最为简单&#xff0c;typecho需要一定的技术含量&#xff0c;这里暂…

17.4:图的拓扑排序

拓扑序一定是有向无环图。 拓扑排序不唯一 拓扑排序方法一&#xff1a; 利用入度为零进行排序 思路&#xff1a;谁的入度为0&#xff0c;谁就是开始节点&#xff0c;将开始节点打印完之后&#xff0c;将开始节点的直接邻居的入度减1&#xff0c;然后重复。 package algorith…

【软件测试】稳定性和可靠性测试在软件开发中的重要性

软件测试的某些方面经常会在那些刚接触流程的人中造成混淆——例如在稳定性和可靠性测试之间划清界限。 两者通常可以互换使用&#xff0c;并且有一个共同的目标&#xff0c;即确保系统可以在选定的时间范围内稳定运行。 在这篇文章中&#xff0c;我们将仔细研究什么是稳定性测…

10年Java开发,准备去腾讯了~

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;又得准备面试了&#xff0c;不知道从何下手&#xff01; 不论是跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 为了帮大家节约时间&a…

chatgpt赋能python:Python分词,助力文本处理和搜索引擎优化

Python分词&#xff0c;助力文本处理和搜索引擎优化 作为一种广泛应用于文本处理的编程语言&#xff0c;Python在分词处理方面也有着得天独厚的优势。Python分词不仅可以帮助我们完成文本处理任务&#xff0c;还能够为搜索引擎优化提供便利。 什么是分词&#xff1f; 分词&a…

集线器与交换机的区别

1.集线器与交换机的区别 笔记来源&#xff1a; 湖科大教书匠&#xff1a;集线器与交换机的区别 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 1.1 集线器 早期总线型以太网的机械连接点不太可靠 使用双绞线和集线器相对可靠 集线器可以在物理层…

计算机网络和因特网概述

一.计算机网络和因特网 计算机网络是指多台计算机通过通信线路或其他连接方式相互连接起来&#xff0c;实现信息交换和共享的系统。而因特网是利用标准化协议互联起来的全球性计算机网络&#xff0c;是计算机网络的一种特殊形式。 1.1 什么是因特网 1.1.1 从具体构成描述 因…

day04——特征处理之特征降维

特征处理之特征降维 一、特征选择Filter(过滤式)1&#xff0c;低方差特征过滤2、相关系数 Embedded (嵌入式) 二、主成分分析&#xff08;PCA&#xff09; 特征降维&#xff1a;如果特征本身存在问题或者特征之间相关性较强&#xff0c;对于算法学习预测会影响较大。降维是指在…

设计模式-解释器模式

解释器模式 问题背景解释器模式基本介绍原理类图 使用解释器模式来解决问题UML类图代码示例运行结果 注意事项和细节 问题背景 通过解释器模式来实现一个表达式的加减运算 例如&#xff1a;在我们先输入一个表达式&#xff1a;abc-de&#xff0c;然后输入a&#xff0c;b&#…

layui框架实战案例(22):layui-tab-title的宽度自适应的解决方案

HTML源代码 <div class"layui-card"><div class"layui-card-header">卡片风格</div><div class"layui-card-body"><div class"layui-tab layui-tab-card"><ul class"layui-tab-title">…

酷游SVG-地址路径

说到SVG中最复杂的东西&#xff0c;路径(Path)绝对是一个大魔王&#xff0c;它有太多的commands可以用来定义路径。【娜娜提供酷游地kw9㍠neт地址】透过Path虽然可以绘制效果不错的SVG图形&#xff0c;但是要自己定义一个个坐标点&#xff0c;再去把它们完美的串连在一起&…

《银行从业法律法规》第二章——金融基础知识

第二章 金融基础知识 第二节 货币政策 【 知识点1】 货币政策目标 制定和实施货币政策&#xff0c; 首先必须明确货币政策最终要达到的目的&#xff0c; 即货币政策的最终目标。中央银行通过货币政策工具操作直接引起操作目标的变动&#xff0c;操作目标的变动又通过一定的途…

libarchive 如何在Ubuntu中进行安装

简介 libarchive是一个开源的压缩和归档库。 它支持实时访问多种压缩文件格式&#xff0c;比如7z、zip、cpio、pax、rar、cab、uuencode等&#xff0c;因此应用十分广泛。 举个例子&#xff0c;我写了一段代码&#xff0c;想要解压一个压缩包&#xff0c;那我就得 fork 一个 …

python制作简单版天天酷跑,是不是你平日里摸鱼小游戏呀

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 天天酷跑是一款轻松好玩、简单时尚的跑酷类手机游戏。 那我们能不能用python模拟出这个一个游戏呢&#xff1f; 答案当然是可以的&#xff0c;今天我就给大家带来简易版的天天酷跑小游戏 开发环境&#xff1a; 版 本&a…