自动化测试篇:Java+selenium+appium自动化测试详解

news2024/11/26 13:32:38

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

同时,我也准备了一份软件测试视频教程(含接口、自动化、性能等),需要的可以直接在下方观看,或者直接关注VX公众号:互联网杂货铺,免费领取

软件测试视频教程观看处:

自动化测试篇—实战案例:自动化及接口自动化本质及适用场景

二、启动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");  //h5
 
        des.setCapability("platformName", "Android");//平台名称
 
        des.setCapability("platformVersion", "4.4");//手机操作系统版本
 
        des.setCapability("udid", "192.168.229.101:5555");//连接的物理设备的唯一设备标识
 
        des.setCapability("deviceName", "S4");//使用的手机类型或模拟器类型  UDID
 
         
 
        des.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);//设置超时等待时间,默认250ms
 
        driver.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;
 
    @BeforeTest
 
    public 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.contacts
 
        des.setCapability("appActivity", ".Calculator");//.activities.PeopleActivity
 
        des.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);    
 
    }
 
}

七、写在最后 

PS:这里分享一套软件测试的自学教程合集。对于在测试行业发展的小伙伴们来说应该会很有帮助。除了基础入门的资源,博主也收集不少进阶自动化的资源,从理论到实战,知行合一才能真正的掌握。全套内容已经打包到网盘,内容总量接近500个G。如需要软件测试学习资料,关注公众号(互联网杂货铺),后台回复1,整理不易,给个关注点个赞吧,谢谢各位大佬!

☑ 240集-零基础到精通全套视频课程
☑ [课件+源码]-完整配套的教程
☑ 18套-测试实战项目源码
☑ 37套-测试工具软件包
☑ 268道-真实面试题
☑ 200个模板-面试简历模板、测试方案模板、软件测试报告模板、测试分析模版、测试计划模板、性能测试报告、性能测试报告、性能测试脚本用例模板(信息完整)

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

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

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

相关文章

JAVA智慧工地管理系统源码基于微服务

智慧工地是将互联网的理念和科技引入施工现场,从施工现场源头抓起,大程度的收集人员、安全、环境、质量等关键业务数据。通过结合物联网、大数据、互联网、云计算等技术建立云端大数据管理平台,形成端云大数据的体系与模式,这就是…

thinkphp漏洞复现

thinkphp漏洞复现 ThinkPHP 2.x 任意代码执行漏洞Thinkphp5 5.0.22/5.1.29 远程代码执行ThinkPHP5 5.0.23 远程代码执行ThinkPHP5 SQL Injection Vulnerability && Sensitive Information Disclosure VulnerabilityThinkPHP Lang Local File Inclusion ThinkPHP 2.x 任…

20.6 OpenSSL 套接字分发RSA公钥

通过上一节的学习读者应该能够更好的理解RSA加密算法在套接字传输中的使用技巧,但上述代码其实并不算完美的,因为我们的公钥和私钥都必须存储在本地文本中且公钥与私钥是固定的无法做到更好的保护效果,而一旦公钥与私钥泄密则整个传输流程都将…

开源检测数据库是否明文存储工具——OpenDLP的使用教程

前言 这些天Darren洋在做项目安全test调研的过程中,发现了一款非常不错的可自定义敏感数据类型的检测数据库是否明文存储工具。 OpenDLP 是一个开源项目,提供用于数据丢失预防(DLP)的工具。它允许自定义扫描规则,包括对…

一、Hadoop初始化配置(final+ubuntu保姆级教程)

1、配置虚拟机 三台虚拟机,分别为node1、node2、node3,内存分别为4G、2G、2G,现存最好为(>40G),如下: 2、修改主机名 分别打开三台虚拟机,root用户输入一下命令: no…

openLayers--绘制多边形、获取视图的中心点、获取当前地图等级、设置地图等级

openLayers绘制多边形、获取视图中心点 前言效果图1、导入LineString2、创建添加多边形3、定义多变形样式4、获取当前视图的中心点5、获取当前视图等级6、设置地图等级 前言 上一篇文章在vue项目中绘制了openlayers绘制了地图和标记点,本篇文章讲解openlayers绘制多…

Java医院HIS系统源码

Java医院HIS系统源码 项目描述 该项目是用springbootlayuishiro写的医院管理系统,该系统的业务比较复杂,数据库一共有36张表。项目的视频业务参考文档,都在百度云盘中。可以先看看视频和参考文档。 运行环境 jdk8mysqlIntelliJ IDEAmaven…

Docker学习——③

文章目录 1、Docker Registry(镜像仓库)1.1 什么是 Docker Registry?1.2 镜像仓库分类1.3 镜像仓库工作机制1.4 常用的镜像仓库 2、镜像仓库命令3、镜像命令[部分]4、容器命令[部分]4.1 docker run4.2 docker ps 5、CentOS 搭建一个 nginx 服…

英伟达显卡深度学习训练微调环境安装清单

可以考虑 安装完操作系统后,安装更新及其他基础软件如gcc cmake, 再安装英伟达几件套(这里列出了四个) 如果自带的python版本在3.8或以上,再安装python常用库。 python版本不能太低,看你要跑的代码的需求了…

Leetcode-70 爬楼梯

递归公式方法会出现超时(时间复杂度大于On^2) 方法一:依然使用递归思想,由于递归过程中会出现反复计算问题,所以定义两个变量分别记录f(n-1)和f(n-2)的值,避免重复计算,减小时间复杂度 class …

mysql索引深度学习

索引是什么? 索引是一种用于加快查询和索引的数据结构,其本质上就是一种排序好的数据结构,就类似书的目录。 索引的底层有多种实现的结构:b树,b树,Hash,红黑树。InnoDB和MyISAM的索引都是通过…

【安全】Java幂等性校验解决重复点击(6种实现方式)

目录 一、简介1.1 什么是幂等?1.2 为什么需要幂等性?1.3 接口超时,应该如何处理?1.4 幂等性对系统的影响 二、Restful API 接口的幂等性三、实现方式3.1 数据库层面,主键/唯一索引冲突3.2 数据库层面,乐观锁…

Flink SQL 窗口聚合详解

1.滚动窗⼝(TUMBLE) **滚动窗⼝定义:**滚动窗⼝将每个元素指定给指定窗⼝⼤⼩的窗⼝,滚动窗⼝具有固定⼤⼩,且不重叠。 例如,指定⼀个⼤⼩为 5 分钟的滚动窗⼝,Flink 将每隔 5 分钟开启⼀个新…

Activiti7工作原理

Java Activiti是一个开源的工作流引擎,用于管理和执行业务流程。 它是基于BPMN 2.0标准的,提供了丰富的功能和灵活性。 Java Activiti的工作原理如下: 1.Java Activiti 流程建模 使用BPMN 2.0标准的图形化编辑器,可以创建和定义…

基于饥饿游戏算法的无人机航迹规划-附代码

基于饥饿游戏算法的无人机航迹规划 文章目录 基于饥饿游戏算法的无人机航迹规划1.饥饿游戏搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用饥饿游戏算法来优化无人机航迹规划。 …

Docker容器技术实战3

8、docker原生网络 Docker原生网络基于Linux桥接技术和虚拟网络接口,使用了Linux内核的网络功能。每个Docker容器都有自己的网络命名空间,这使得容器之间可以使用独立的IP地址,并隔离了容器的网络栈。 当创建一个Docker原生网络时&#xff…

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題 新搭建的FLINK集群出现的问题汇总 1.新搭建的Flink集群和Hadoop集群无法正常启动Flink任务 查看这个提交任务的日志无法发现有用的错误信息。 进一步查看yarn日志: 发现只有JobManager的错误日志出现了如下的…

JOSEF约瑟 数显三相电压继电器 HJY-931A/D 导轨安装

名称:数字交流三相电压继电器型号:HJY-93系列品牌:JOSEF约瑟电压整定范围:10~450VAC额定电压:200、400VAC功率消耗:≤5W HJY系列 数字交流三相电压继电器 系列型号 HJY-931A/D数字式交流三相电压继电器&am…

吴恩达《机器学习》5-6:向量化

在深度学习和数值计算中,效率和性能是至关重要的。一个有效的方法是使用向量化技术,它可以显著提高计算速度,减少代码的复杂性。接下来将介绍向量化的概念以及如何在不同编程语言和工具中应用它,包括 Octave、MATLAB、Python、Num…

lvgl生成图片

网址:https://lvgl.io/tools/imageconverter CF_TRUE_COLOR:可以生成565,232,等多种形式的数组,选择Carray,会生成C数组。