Appium 2安装与使用java对Android进行自动化测试

文章目录

    • 1、Appium 2.1安装
      • 1.1、系统要求
      • 1.2、安装Appium2.1服务
      • 1.3、安装UiAutomator2驱动
      • 1.4、安装Android SDK platform tools
      • 1.5、下载OpenJDK
    • 2、Android自动代码例子
      • 2.1、安装Android自动化测试元素定位工具Appium Inspector
      • 2.2、编写android app自动化测试代码和使用extentreports生成测试报告

1、Appium 2.1安装

1.1、系统要求

当前Appium2.1服务器的要求:

  • 支持macOS、Linux或Windows操作系统
  • Node.js版本要求^14.17.0 || ^16.13.0 | >=18.0.0
  • NPM版本>= 8 (NPM通常与Node.js捆绑在一起,但可以独立升级)

系统要求:http://appium.io/docs/en/2.1/intro/requirements/

1.2、安装Appium2.1服务

下载nodejs:https://nodejs.org/zh-cn/download/releases
本文下载:node-v18.17.1-win-x64.zip
解压在D:\Program Files\nodejs\node-v18.17.1-win-x64目录
在PATH环境变量中添加

D:\Program Files\nodejs\node-v18.17.1-win-x64

npm默认使用国外源,网络原因容易出现安装依赖失败,本文设置npm为国内源

npm config set registry https://registry.npmmirror.com

运行NPM命令安装Appium,参考官方安装http://appium.io/docs/en/2.1/quickstart/install/

npm i --location=global appium

图片

安装成功后,输入下边命令可以直接启动服务

appium

在这里插入图片描述

1.3、安装UiAutomator2驱动

查看当前可用驱动appium driver list

C:\Users\admin>appium driver list
✔ Listing available drivers
- uiautomator2 [not installed]
- xcuitest [not installed]
- mac2 [not installed]
- espresso [not installed]
- safari [not installed]
- gecko [not installed]
- chromium [not installed]
  • uiautomator2 用于android自动化测试
  • xcuitest 用于ios自动化测试
    本文只研究android测试,输入下边命令安装
appium driver install uiautomator2

在这里插入图片描述

官方参考:http://appium.io/docs/en/2.1/quickstart/uiauto2-driver/

1.4、安装Android SDK platform tools

下载Android SDK platform tools:Android SDK platform tools
解压目录:D:\ProgramData\android\sdk\platform-tools
在PATH环境变量中添加

D:\ProgramData\android\sdk\platform-tools

如果使用真机测试,只安装platform tools就可以了,如果使用模拟器,需要安装完整在sdk,可以下载Android Studio:https://developer.android.google.cn/studio,使用Android Studio里面的管理SDK工具管理相关SDK和工具。
在这里插入图片描述
在这里插入图片描述

1.5、下载OpenJDK

下载OpenJDK:https://21doc.net/java/awesomejava#jvm-and-jdk
当前版本支持JDK11,本文使用bellsoft-jdk11.0.20+8-windows-amd64.zip,下载地址:https://bell-sw.com/pages/downloads/

下载后解压在:C:\Program Files\Java\bellsoft\jdk-11.0.20
在PATH环境变量中添加

C:\Progra~1\Java\bellsoft\jdk-11.0.20\bin

2、Android自动代码例子

2.1、安装Android自动化测试元素定位工具Appium Inspector

Appium Inspector官网:https://github.com/appium/appium-inspector
官方介绍Appium Inspector基本上只是一个带有用户界面的Appium客户端(如WebdriverIO、Appium的Java客户端、Appium的Python客户端等)。有一个接口用于指定使用哪个Appium服务器、设置哪些功能,然后在启动会话后与元素和其他Appium命令进行交互。
在1.22版本后appium-deskop不集成Appium Inspector,所以Appium Inspector需要单独打开。
Appium Inspector支持web和客户端版本。

  • web版本
    web版本可以直接访问:https://inspector.appiumpro.com/使用。

  • 客户端版本
    下载地址:https://github.com/appium/appium-inspector/releases
    在这里插入图片描述

点击“启动会话”,就可以打开APP,进行元素定位
在这里插入图片描述

参数配置可查看:https://appium.io/docs/en/2.1/guides/caps/

** 启动会话可能会出现下边的错误提示**

Exception in thread "main" org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Response code 500. Message: An unknown server-side error occurred while processing the command. Original error: Check https://forum.xda-developers.com/t/i-cant-enable-write_secure_settings-for-an-app-over-adb.3855596/ for throubleshooting. Error executing adbExec. Original error: 'Command 'D:\\ProgramData\\android\\sdk\\platform-tools\\adb.exe -P 5037 -s 972cac1 shell 'settings delete global hidden_api_policy_pre_p_apps;settings delete global hidden_api_policy_p_apps;settings delete global hidden_api_policy'' exited with code 255'; Command output: Security exception: Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS

解决办法

  • 小米设备: 开启 USB调试(安全设置)
    (1) 手机-插入 sim卡
    (2) 设置 - 更多设置 - 开发者选项 - USB调试(安全设置)- 开启

  • OPPO设备: 开启 禁止权限监控
    开发者选项 - 禁止权限监控 - 开启

2.2、编写android app自动化测试代码和使用extentreports生成测试报告

使用appium的java-client库(https://github.com/appium/java-client)编写android app自动化测试代码,并使用extentreports生成测试报告
maven工程,pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.penngo.app</groupId><artifactId>monitor_app</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><log4j2.version>2.17.2</log4j2.version><slf4j_simple.version>1.7.36</slf4j_simple.version><lombok.version>1.18.24</lombok.version><testng.version>7.4.0</testng.version><hutool.version>5.8.3</hutool.version><extentreports-testng-adapter.version>1.2.3</extentreports-testng-adapter.version><extentreports.version>5.0.9</extentreports.version></properties><dependencies><dependency><groupId>io.appium</groupId><artifactId>java-client</artifactId><version>8.5.1</version>
<!--            <scope>test</scope>--></dependency><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.9.1</version></dependency><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>${testng.version}</version></dependency><dependency><groupId>com.aventstack</groupId><artifactId>extentreports</artifactId><version>${extentreports.version}</version></dependency><dependency><groupId>com.aventstack</groupId><artifactId>extentreports-testng-adapter</artifactId><version>${extentreports-testng-adapter.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${log4j2.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${log4j2.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>${slf4j_simple.version}</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency></dependencies><repositories><repository><id>alimaven</id><name>Maven Aliyun Mirror</name><url>https://maven.aliyun.com/repository/central</url></repository></repositories><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>${maven.compiler.source}</source><target>${maven.compiler.source}</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version><configuration><skip>true</skip></configuration></plugin></plugins></build>
</project>

测试用例java代码

import cn.hutool.core.io.FileUtil;
import com.aventstack.extentreports.testng.listener.ExtentIReporterSuiteClassListenerAdapter;
import io.appium.java_client.AppiumBy;
import io.appium.java_client.android.Activity;
import io.appium.java_client.android.AndroidDriver;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;import java.io.File;
import java.io.FileOutputStream;
import java.time.Duration;
import java.util.HashSet;
import java.util.List;/*** 例子* https://github.com/appium/java-client/blob/master/src/test/java/io/appium/java_client/android/AndroidTouchTest.java*/
@Listeners(ExtentIReporterSuiteClassListenerAdapter.class)
@Slf4j
@Test(description="APP测试", priority = 1)
public class AppTest {public static final String APP_ID = "com.penngo.xxx";protected static final int PORT = 4723;protected static AndroidDriver driver = null;private static AppiumDriverLocalService service;@BeforeClasspublic void setUpAll(){service = new AppiumServiceBuilder().withIPAddress("127.0.0.1").usingPort(PORT).build();service.start();UiAutomator2Options options = new UiAutomator2Options().setDeviceName("972cac1").setAppPackage(APP_ID).setAppActivity("com.penngo.xxx.activity.MainActivity");driver = new AndroidDriver(service.getUrl(), options);}@AfterClasspublic void tearDownAll(){if(driver != null){driver.quit();}}/*** app首页*/@Test(description="APP首页", priority = 1)public void testHome() {String activity = driver.currentActivity();Assert.assertEquals(activity, ".activity.MainActivity");}/*** app 我首页*/@Test(description="关于", priority = 2)public void testMe() {String activity = driver.currentActivity();// 获取底部5个选项WebElement navTabIndicator = driver.findElement(AppiumBy.id("com.penngo.xxx:id/NavTabIndicator"));List<WebElement> list = navTabIndicator.findElements(AppiumBy.className("android.widget.TextView"));System.out.println("list.size====="+ list.size());HashSet tabs = new HashSet();WebElement myElement = null;for(WebElement el:list){String text = el.getAttribute("text");if(text.equals("关于")){myElement = el;}}// 切换到关于选项卡myElement.click();new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.elementToBeClickable(AppiumBy.id("com.penngo.xxx:id/setting_fragment")));// 切换到设置WebElement setting = driver.findElement(AppiumBy.id("com.penngo.xxx:id/setting_fragment"));setting.click();new WebDriverWait(driver, Duration.ofSeconds(10)).until(d->{AndroidDriver driver2 = (AndroidDriver)d;String currentActive = driver2.currentActivity();if(!currentActive.equals(activity)){log.info("设置====" + activity);return currentActive;}else{return null;}});System.out.println("设置 Activity====" + driver.currentActivity());log.info("设置 Activity====" + driver.currentActivity());// 截图File screenShotFile = driver.getScreenshotAs(OutputType.FILE);System.out.println("screenShotFile====" + screenShotFile);FileUtil.copy(screenShotFile.getAbsolutePath(), new File("logs/setting.png").getAbsolutePath(), true);}}

运行效果:
在这里插入图片描述

生成测试报告:
在这里插入图片描述

更多官方例子:https://github.com/appium/java-client/tree/master/src/test/java/io/appium/java_client/android

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见架构类型

目录 1.单机架构 2.应用数据分离架构 3.读写分离架构 4.冷热分离架构 5.垂直分库架构 6.微服务架构 7.容器编排架构 1.单机架构 单机架构是简单的将应用服务和数据库服务部署到同一台机器上。 缺点&#xff1a;存在很大的性能限制。 2.应用数据分离架构 引入负载均衡&a…

Git概述

目录 一、什么是Git 二、什么是版本控制系统 三、Git和SVN对比 SVN集中式 SVN优缺点 Git分布式 Git优缺点 四、Git工作流程 四个工作区域 工作流程 五、Git下载与安装 一、什么是Git 很多人都知道&#xff0c;林纳斯托瓦兹在1991年创建了开源的Linux&#xff0c;从…

鲁棒优化入门(5)—Matlab+Yalmip求解鲁棒优化编程实战

之前的博客&#xff1a;鲁棒优化入门&#xff08;二&#xff09;——基于matlabyalmip求解鲁棒优化问题 去年发布了使用Yalmip工具箱求解鲁棒优化问题的博客之后&#xff0c;陆陆续续有朋友问我相关的问题&#xff0c;有人形容从学习这篇博客到求解论文中的鲁棒优化问题&#x…

【云原生】Docker基本原理及镜像管理

目录 一、Docker概述 1.1 IT架构的演进&#xff1a; 1.2 Docker初始 1.3 容器的特点 1.4 Docker容器与虚拟机的区别 1.5 容器在内核中支持2种重要技术 1.6 Docker核心概念 1&#xff09;镜像 2&#xff09;容器 3&#xff09;仓库 二、安装Docker 2.1 Yum安装Docker…

PCTA 认证考试高分通过经验分享

作者&#xff1a; msx-yzu 原文来源&#xff1a; https://tidb.net/blog/0b343c9f 序言 我在2023年8月10日&#xff0c;参加了 PingCAP 认证 TiDB 数据库专员 V6 考试 &#xff0c;并以 90分 的成绩通过考试。 考试总分是100分&#xff0c;超过60分就算通过考试。试卷…

centos 7.9 部署django项目

1、部署框架 主要组件&#xff1a;nginx、uwsgi、django项目 访问页面流程&#xff1a;nginx---》uwsgi---》django---》uwsgi---》nginx 2、部署过程 操作系统&#xff1a;centos 7.9 配置信息&#xff1a;4核4G 50G 内网 eip &#xff1a;10.241.103.216 部署过程&…

小素数,大智慧

小素数&#xff0c;大智慧 定义判断方法方法1方法2方法3方法4方法5方法6方法7 定义 素数&#xff08;质数&#xff09;&#xff1a;在大于 1 的自然数中&#xff0c;只有 1 和该数本身两个因数的数 素数&#xff08;质数&#xff09;&#xff1a;在大于1的自然数中&#xff0c;…

K8S用户管理体系介绍

1 K8S账户体系介绍 在k8s中&#xff0c;有两类用户&#xff0c;service account和user&#xff0c;我们可以通过创建role或clusterrole&#xff0c;再将账户和role或clusterrole进行绑定来给账号赋予权限&#xff0c;实现权限控制&#xff0c;两类账户的作用如下。 server acc…

ListNode相关

目录 2. 链表相关题目 2.1 合并两个有序链表&#xff08;简单&#xff09;&#xff1a;递归 2.2 删除排序链表中的重复元素&#xff08;简单&#xff09;&#xff1a;一次遍历 2.3 两链表相加&#xff08;中等&#xff09;&#xff1a;递归 2.4 删除链表倒数第N个节点&…

ARM--day4(电灯实验、分析RCC、GPIO控制器,PMOS管、NMOS管的基本原理)

电灯实验代码&#xff1a; .text .global _start _start: /**********LED1点灯**************/RCC_INIT:1.使能GPIOE组控制器&#xff0c;通过RCC_AHB4ENSETR寄存器设置第&#xff3b;5:4&#xff3d;位写&#xff11;---->0x50000A28[4]1ldr r0,0x50000A28ldr r1,[r0]orr…

京东门详一码多端探索与实践 | 京东云技术团队

本文主要讲述京东门详业务在支撑过程中遇到的困境&#xff0c;面对问题我们在效率提升、质量保障等方向的探索和实践&#xff0c;在此将实践过程中问题解决的思路和方案与大家一起分享&#xff0c;也希望能给大家带来一些新的启发 一、背景 1.1、京东门详介绍 1.1.1、京东门…

【MySQL】索引

本期我们好好唠唠索引 目录 一、索引的概念 二、索引的重要性 三、对于索引的理解 3.1 MySQL与磁盘交互的基本单位page 3.2 MySQL中的数据交互过程 3.3 索引建立的过程 3.3.1 page的存储形式 3.3.2 B树的形成 3.4 为什么不用其他数据结构来建立索引 四、聚簇索引和非…

Python tkinter Notebook标签添加关闭按钮元素,及左侧添加存储状态提示图标案例,类似Notepad++页面

效果图展示 粉色框是当前页面&#xff0c;橙色框是鼠标经过&#xff0c;红色框是按下按钮&#xff0c;灰色按钮是其他页面的效果&#xff1b; 存储标识可以用来识别页面是否存储&#xff1a;例如当前页面已经保存用蓝色&#xff0c;未保存用红色&#xff0c;其他页面已经保存用…

【力扣】42. 接雨水 <模拟、双指针、单调栈>

【力扣】42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 目录 【力扣】42. 接雨水题解暴力双指针单调栈 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&…

数据结构<树和二叉树>顺序表存储二叉树实现堆排

✨Blog&#xff1a;&#x1f970;不会敲代码的小张:)&#x1f970; &#x1f251;推荐专栏&#xff1a;C语言&#x1f92a;、Cpp&#x1f636;‍&#x1f32b;️、数据结构初阶&#x1f480; &#x1f4bd;座右铭&#xff1a;“記住&#xff0c;每一天都是一個新的開始&#x1…

c语言实现MD5算法

MD5加密 文章目录 MD5加密MD5介绍应用场景代码分析 &#xff08;基于qt5.14.2&#xff09;测试记录 MD5介绍 1。 一种单向加密算法&#xff0c;即对明文加密&#xff0c;而不能通过密文得到明文。对原数据的任何改动&#xff0c;哪怕是1字节&#xff0c;得到的MD5值都有很大的区…

vue路由及打包部署

vue路由&#xff08;前端路由&#xff09;&#xff1a;URL中的hash&#xff08;#号&#xff09;与组件之间的对应关系。 一、安装vue路由 npm install vue-router3.5.1 二、定义路由表 路由表主要记录hash&#xff08;#号&#xff09;与组件之间的对应关系。主要定义在route…

FPGA:uart原理+tx发送模块+rx接收模块

文章目录 一、串口通信二、UART通信三、tx发送模块四、rx模块接收 一、串口通信 处理器与外部设备通信的两种方式&#xff1a; 串行通信&#xff1a; 指数据的各个位使用多条数据线同时进行传输。 并行通信&#xff1a; 将数据分成一位一位的形式在一条数据线上逐个传输。 串…

SQL Injection

SQL Injection 就是通过把恶意的sql命令插入web表单递交给服务器&#xff0c;或者输入域名或页面请求的查询字符串递交到服务器&#xff0c;达到欺骗服务器&#xff0c;让服务器执行这些恶意的sql命令&#xff0c;从而让攻击者&#xff0c;可以绕过一些机制&#xff0c;达到直…

sql server安装报错 合成活动模板库(ATL) 失败

错误 “合成活动模板库(ATL) 规则失败“ 解决办法&#xff1a; 进入SQL Server 2008R2安装包目录找到文件&#xff1a;sqlsupport_msi&#xff0c;安装此文件之后&#xff0c;再安装SQL Server&#xff0c;便可解决该问题。C:\SQL Server 2008R2\new\SQL Server 2008R2\2052_CH…