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.hqwc.cn/news/112379.html

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

相关文章

Python+Django前后端分离

程序示例精选 PythonDjango前后端分离 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《PythonDjango前后端分离》编写代码,代码整洁,规则,易读。 学习与应…

Postman应用——Request数据导入导出

文章目录 导入请求数据导出请求数据导出Collection导出Environments 导出所有请求数据导出请求响应数据 Postman可以导入导出Request和Variable变量配置,可以通过文本方式(JOSN文本)或链接方式进行导入导出。 导入请求数据 可以通过JSON文件…

腾讯mini项目-【指标监控服务重构】2023-08-21

今日已办 PPT 汇报 答辩的时间需要把控人员的分配不够合理效果展示不够清晰,不够熟练重点的调研测试对比报告还未产出 项目待办 50字总结项目意义,top3 难点watermill 和 profile 正则处理otel-sdk 隐式,可扩展接入云 clickhouse 集群&am…

oracle创建表空间、用户、权限以及导入dmp文件

创建表空间 create tablespace A_DATA logging datafile F:\CODEAPP\ORACLE\ORADATA\A_DATA01.DBF size 50m autoextend on next 50m maxsize 32767m extent management local; -- 这个语句将创建一个大小为50MB的数据文件,启用自动扩展功能,每次扩展50…

pdf在线加密怎么做?几个好用的方法分享

PDF在线加密怎么做?在进行PDF在线加密时,您可以使用以下几种方法来确保文档的安全性,并注意以下一些加密的注意事项。 方法一:使用PDF转换加密工具 首先我们可以在电脑上打开迅捷PDF转换器工具,进入该转换工具后先在顶…

ChatGLM GPT原理介绍

图解GPT 除了BERT以外,另一个预训练模型GPT也给NLP领域带来了不少轰动,本节也对GPT做一个详细的讲解。 OpenAI提出的GPT-2模型(https://openai.com/blog/better-language-models/) 能够写出连贯并且高质量的文章,比之前语言模型效果好很多。GPT-2是基于Transformer搭建的,相…

基于虚拟仿真技术的汽车燃油泵控制

在当前激烈的竞争环境下,汽车行业正在加速产业和技术更迭,整车厂对大型ECU嵌入式控制系统和软件的需求迫在眉睫。 然而,复杂而庞大的汽车系统往往由多个物理系统组成,系统所对应的模型都需要在不同的领域实现:发动机、…

vue3+ts 实现移动端分页

current 开始页码 pageSize 结束页码 const sizeref<number>(10) //一页显示十条 const eachCurrentPageref<number>(1) //默认是第一页interface ITdata {current: number,pageSize: number,// xxxx 其他参数... } const selectApplyList ref<…

快速上手Linux基础开发工具

目录 软件包管理器 概念理解 用法示例 - 以yum为例 vim 模式的切换 常用操作 插件和配置 gcc/g gdb make / makefile 软件包管理器 概念理解 在Linux下安装软件的话&#xff0c;一个比较原始的办法是下载程序的源代码&#xff0c;然后进行编译&#xff0c;进而得到…

【LLM】Windows本地CPU部署民间版中文羊驼模型(Chinese-LLaMA-Alpaca)踩坑记录

目录 前言 准备工作 Git Python3.9 Cmake 下载模型 合并模型 部署模型 前言 想必有小伙伴也想跟我一样体验下部署大语言模型, 但碍于经济实力, 不过民间上出现了大量的量化模型, 我们平民也能体验体验啦~, 该模型可以在笔记本电脑上部署, 确保你电脑至少有16G运行…

Modbus RTU(Remote Terminal Unit)与RS-485协议介绍(主站设备(Master)、从站设备(Slave))

文章目录 Modbus RTU与RS-485协议介绍一、引言二、Modbus RTU 协议介绍2.1 Modbus RTU 协议简介2.2 Modbus RTU 协议帧结构主站设备、从站设备与从站设备地址2.3 Modbus RTU 协议举例 三、RS-485 协议介绍3.1 RS-485 协议简介3.2 RS-485 物理连接方式3.3 RS-485 与 Modbus RTU …

echarts的折线图,在点击图例后,提示出现变化,不报错。tooltip的formatter怎么写

在点击图例的年后&#xff0c;提示框会相应的变化&#xff0c;多选和单选都会响应变化。tooptip的重度在formatter tooltip:{show:true,trigger:"axis",alwaysShowContent:true,triggerOn:"mousemove",textStyle:{color:"#fff"},backgroundColor…