Java + Selenium + Appium自动化测试

一、启动测试机或者Android模拟器(Genymotion俗称世界上最快的模拟器,可自行百度安装)

二、启动Appium(Appium环境安装可自行百度)

三、安装应用到Genymotion上,如下图我安装一个计算机的小应用,包名为CalcTest.apk

安装步骤:(基于Android SDK已经配置好了环境变量,可自行百度)
1、Win + R
2、CMD
3、adb devices   --检查操作,列出存在的设置名称
4、adb  install  F:\Appium\CalcTest.apk     --正式安装App

测试apk下载地址:https://files.cnblogs.com/files/yyym/CalcTest.apk

如下图:192.168.229.101:5555就是我刚开启的Genymotion虚拟机

 

四、安装成功之后回到Genymotiong可以看到已经安装成功了

打开该应用,可以看到实际是个简单的计算器

五、打开Eclipse创建Maven项目并使用uiautomatorviewer工具(Android SDK工具包自带的)进行基本元素定位操作,元素定位方式前面我们已经详细讲解过了。
1、打开Android SDK可找到路径:android-sdks\tools如下(获取App包名可反编译:aapt dump badging apk路径)

2、打开uiautomatorviewr.bat

 3、编写基本代码如下仅供参考:

package appium_demo;import java.net.MalformedURLException;import java.net.URL;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.remote.DesiredCapabilities;import io.appium.java_client.android.AndroidDriver;/** * @author 李小卫 E-mail:yyymlxw@163.com @date 创建时间2018年2月11日上午10:10:02 */public class calc_demo {public static void main(String[] args) throws MalformedURLException {AndroidDriver driver;DesiredCapabilities des = new DesiredCapabilities();//    des.setCapability("automationName", "Appium");//Selendroid //自动化的模式选择//     des.setCapability("app", "C:\\software\\CalcTest.apk");//配置待测试的apk的路径//      des.setCapability("browserName", "chrome");  //h5des.setCapability("platformName", "Android");//平台名称des.setCapability("platformVersion", "4.4");//手机操作系统版本des.setCapability("udid", "192.168.229.101:5555");//连接的物理设备的唯一设备标识des.setCapability("deviceName", "S4");//使用的手机类型或模拟器类型  UDIDdes.setCapability("appPackage", "com.sky.jisuanji");//App安装后的包名,注意与原来的CalcTest.apk不一样des.setCapability("appActivity", ".JisuanjizixieActivity");//app测试人员常常要获取activity,进行相关测试,后续会讲到des.setCapability("unicodeKeyboard", "True");//支持中文输入des.setCapability("resetKeyboard", "True");//支持中文输入des.setCapability("newCommandTimeout", "10");//没有新命令时的超时时间设置des.setCapability("nosign", "True");//跳过检查和对应用进行 debug 签名的步骤driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), des);//虚拟机默认地址driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//设置超时等待时间,默认250msdriver.findElement(By.id("com.android.calculator2:id/digit1")).click();//定位'1'driver.findElement(By.id("com.android.calculator2:id/plus")).click();//定位'+'driver.findElement(By.id("com.android.calculator2:id/digit6")).click();//定位'6'driver.findElement(By.id("com.android.calculator2:id/equal")).click();//定位'='}}   

 六、使用TestNG编写正式测试用例并开始执行测试了

package appium_operate;import java.net.MalformedURLException;import java.net.URL;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.remote.DesiredCapabilities;import org.testng.Assert;import org.testng.annotations.BeforeTest;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;import io.appium.java_client.android.AndroidDriver;/** * @author 李小卫 E-mail:yyymlxw@163.com @date 创建时间2018年2月11日上午10:30:02 */public class CalcTest {AndroidDriver driver;@BeforeTestpublic void setUp() throws MalformedURLException{DesiredCapabilities des = new DesiredCapabilities();//      des.setCapability("app", "c:\\");des.setCapability("platformName", "Android");des.setCapability("platformVersion", "4.4");des.setCapability("udid", "192.168.43.101:5555");des.setCapability("deviceName", "s4");des.setCapability("appPackage", "com.android.calculator2");//com.android.contactsdes.setCapability("appActivity", ".Calculator");//.activities.PeopleActivitydes.setCapability("unicodeKeyboard", "True");des.setCapability("resetKeyboard", "True");des.setCapability("newCommandTimeout", "15");des.setCapability("nosign", "True");driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),des);driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);}@Test(enabled = false)public void add() {driver.findElement(By.xpath("//android.widget.Button[@text='5']")).click();driver.findElement(By.xpath("//android.widget.Button[@text='+']")).click();driver.findElement(By.xpath("//android.widget.Button[@text='8']")).click();driver.findElement(By.xpath("//android.widget.Button[@text='=']")).click();String value = driver.findElement(By.xpath("//android.widget.EditText[@class='android.widget.EditText']")).getAttribute("text");Assert.assertEquals(value, "13");      }@Test(enabled = false)public void sub() {driver.findElement(By.xpath("//android.widget.Button[@text='1']")).click();driver.findElement(By.xpath("//android.widget.Button[@text='0']")).click();driver.findElement(By.xpath("//android.widget.Button[@text='-']")).click();driver.findElement(By.xpath("//android.widget.Button[@text='8']")).click();driver.findElement(By.xpath("//android.widget.Button[@text='=']")).click();String value = driver.findElement(By.xpath("//android.widget.EditText[@class='android.widget.EditText']")).getAttribute("text");Assert.assertEquals(value, "2");       }@Test(enabled = false)public void mul() {driver.findElement(By.xpath("//android.widget.Button[@text='5']")).click();driver.findElement(By.xpath("//android.widget.Button[@text='×']")).click();driver.findElement(By.xpath("//android.widget.Button[@text='8']")).click();driver.findElement(By.xpath("//android.widget.Button[@text='=']")).click();String value = driver.findElement(By.xpath("//android.widget.EditText[@class='android.widget.EditText']")).getAttribute("text");Assert.assertEquals(value, "40");      }@DataProvider(name="testdata")public Object[][] getData(){return new Object[][]{{"20","80","100","+"},{"90","3","270","×"},{"6","2","3","÷"}};}@Test(dataProvider = "testdata")public void calcTestcase(String num1,String num2,String result,String calcType){for(char num:num1.toCharArray()){driver.findElement(By.xpath("//android.widget.Button[@text='"+String.valueOf(num)+"']")).click();}driver.findElement(By.xpath("//android.widget.Button[@text='"+calcType+"']")).click();for(char num:num2.toCharArray()){driver.findElement(By.xpath("//android.widget.Button[@text='"+String.valueOf(num)+"']")).click();}driver.findElement(By.xpath("//android.widget.Button[@text='=']")).click();String value = driver.findElement(By.xpath("//android.widget.EditText[@class='android.widget.EditText']")).getAttribute("text");Assert.assertEquals(value, result);    }}

下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

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

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

相关文章

epoll及总结

使用方法:基本与poll相同 生成对象改为epoll() 将所有事件类型改为EPOLL类型epll特点 epoll 效率比select poll要高 epoll监控数量比select 要多 epoll的触发方式比pollduo(EPOLLET边缘触发)""" poll_server.py 完成tcp并发服务 Io多路复用实现并发建立fileno -…

webpack:css-loader和style-loader关系

测试 当我们webpack 的 rules 啥都没配置的时候 const path require(path);module.exports {entry: ./src/index.js,output: {filename: index.js,path: path.resolve(__dirname, dist)},module: {rules: []} };我们在 js 中导入了 css,发现报错,因为…

TypeScript项目配置

前言 我们需要建立tsconfig.json 作用 用于标识 TypeScript 项目的根路径; 用于配置 TypeScript 编译器; 用于指定编译的文件。 重要字段 files - 设置要编译的文件的名称; include - 设置需要进行编译的文件,支持…

Powdersigner + PostgreSql 同步表结构到pg数据库

要用Powdersigner同步表结构到PostgreSql数据库, Powdersigner 版本是 16.5,当前模型是mysql的 1,修改当前模型内容为postgresql的 Database --> Change Current DBMS 选择PostgreSQL 最大版本的(因为Powdersigner内置版本一…

错误: 找不到或无法加载主类 Main

在用git回退到上个版本后发现,无法运行项目并提示 错误: 找不到或无法加载主类 Main 可以看到Main前面的图标也是号。 查了半天没有解决,问了个大佬,大佬一下就解决掉了,本文记录下解决过程。 错误原因是编辑器无法找到代码位置&…

Java面向对象编程

设一个有序的单链表中有n个结点,现要求插入一个新结点后使得单链表仍然保持有序,则该操作的时间复杂度() A. O(log2n) B. O(1) C. O(n2) D. O(n) 答案:D 一个栈的初始状态为空。首先将元素5,4,3…

为了工作刷题

1.同步通信和异步通信有什么区别?UART、SPI和I2C分别属于什么类型的通信方式? 同步通信:在同步通信中,发送方和接收方之间使用共享的时钟信号来同步数据传输。发送方按照时钟信号的边沿(上升沿或下降沿)将数…

DP读书:《openEuler操作系统》(二)操作系统的发展史

操作系统的发展历史 操作系统的发展历史手工操作时代批处理系统多道程序系统分时操作系统CTSSMULTICS的历史UNIX和Linux的历史Debian系列Red Hat系列 DOS和Windows的历史DOS的历史:Windows的历史: Android和iOS的历史Android:iOS:…

7分钟了解ChatGPT是如何运作的

ChatGPT是现在最为热门的聊天助手应用,它使用了一个大型语言模型(LLM),即GPT-3.5。它通过大量的文本数据进行训练,以理解和生成人类语言。但是,你是否有了解过ChatGPT是如何运作的吗? 下面我们就一起通过这个视频来一起…

uni-app轮播图制作

Uni-app是一种跨平台开发框架,可以用来开发多个平台的应用程序。在Uni-app中,可以使用uni-swiper组件制作轮播图。 制作轮播图的步骤如下: 在pages文件夹中创建一个新页面,例如index.vue。 在index.vue中添加uni-swiper组件&…

C++自定义swap函数实现交换两个变量的值兼谈参数传递

C自定义swap函数实现交换两个变量的值兼谈参数传递 在C中,交换两个变量的值可以通过多种方法实现。常见的是使用临时变量,源码如下: 在上面的代码中,我们首先定义了两个变量a和b,并使用cout语句输出了它们的初始值。…

InfiniBand vs 光纤通道,存储协议的选择

数字时代,数据量爆发增长,企业越来越迫切地追求高吞吐量、低延迟和更高性能的网络基础设施,存储协议的选择变得愈发至关重要。在众多存储协议中,InfiniBand和光纤通道备受关注。本文旨在深入探讨InfiniBand和光纤通道作为存储协议…

React入门

一、react开始 1、react是什么 用于构建用户界面的JavaScript库 操作DOM呈现页面 (发送请求获取数据和处理数据不由react处理)fessbook开发 2、为什么要学 原生js操作DOM繁琐、效率低 使用原生js直接操作DOM,浏览器会进行大量重绘重排 原…

二叉树与堆

文章目录 1.树的概念及结构(先导知识,了解可跳过)1.1 什么是树1.2 树的相关概念1.3 普通树的存储结构结点的定义 2.二叉树2.1 概念2.2 现实中的二叉树2.3 特殊的二叉树2.4 二叉树的性质(笔试选择题常见)2.5 二叉树的存…

解决 Cannot read property ‘key‘ of undefined

目录 问题解决1解决2最终 问题 现场环境分页查询某些条件项查询时,分页接口获取成功但是数据不渲染,页面像是卡住了: 报错 Cannot read property key of undefined 解决1 有人说 使用的el-pagination在格式化代码的时候layout属性的参数会多加…

C# 模拟button按钮批量锁住与打开

项目需求: 当winform界面上存在多个按钮时(大于2个),用户需求为当点击其中一个按钮后,其它按钮全部为禁用,当被点击的按钮后台逻辑执行完成后,再释放所有按钮。用户可再次点击其它按钮。 此案…

常用设计模式—

一、设计模式简介 23种设计模式 1.1、设计模式七大原则 1.开闭原则 对扩展开放,对修改关闭。 2.依赖倒置原则(面向接口编程) 依赖关系通过接口、抽象类。 3.单一职责原则 一个类、接口、方法只负责一项职责或职能。 4.接口隔离原则 客…

算法之排序

文章目录 前言一、二分查找1、正常二分2、二分找第一个出现要查找的数的位置3、在旋转数组中找最小数字二分总结 一、归并排序1、正常归并2、小和问题归并总结 前言 之前我们学习了各种排序算法,今天来让我们看看在线OJ上的题目吧,有哪些排序算法有什么…

CPP-Templates-2nd--第十四章 实例化

目录 14.1 On-Demand实例化 14.2 延迟实例化 14.2.1 部分实例化和完整实例化 14.2.2 实例化组件 14.3 C实例化模型 14.3.1 两阶段查找 14.3.2 POI 14.3.3 包含式模型 14.4 几种实现方案 14.4.1 贪婪实例化 14.4.2 查询实例化 14.4.3 迭代实例化 参考:…

jvm 内存模型介绍

一、类加载子系统 1、类加载的过程:装载、链接、初始化,其中,链接又分为验证、准备和解析 装载:加载class文件 验证:确保字节流中包含信息符合当前虚拟机要求 准备:分配内存,设置初始值 解析&a…