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");  //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);    

    }

}

          【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通


二、接口自动化项目实战  

三、Web自动化项目实战


四、App自动化项目实战 

五、一线大厂简历


六、测试开发DevOps体系 

七、常用自动化测试工具


八、JMeter性能测试 

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!

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

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【android开发-05】android中activity的启动模式介绍

1,活动的启动模式 在 Android 中,Activity 的启动模式主要有以下四种: 默认启动模式(Normal):这是默认的启动模式,基本上就是标准的启动模式。当一个 Activity 启动后,它将会被压入…

C51--IIC协议

IIC协议初识: 1、概述 IIC全称Inter-Integrated Circuit (集成电路总线) 是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。 IIC属于半双工同步通信方式 SCL——时钟信号 SDA——数据信号 2、特点: 简单性和…

堆栈,BSS,DATA,TEXT

一、目标文件 首先目标文件的构成,Linux下就是.o 文件 编译器编译源码后生成的文件叫目标文件(Object File)。 目标文件和可执行文件一般采用同一种格式,这种存储格式为 ELF。 目前文件的内容至少有编译后的机器指令代码和数据&a…

leetcode 622. 设计循环链表

这道题讲了两种方法,第一个代码是用数组实现的,第二个是用链表实现的,希望对你们有帮助 (最好在VS自己测试一遍,再放到 leetcode上哦) 下面的是主函数(作参考),静下心来…

第二十一章——网络通信

一.网络程序设计基础 1.局域网与互联网 2.网络协议 1.IP协议 IP是Internet Protocol的简称,是一种网络协议。 1.1 TCP/IP层次结构 2.TCP与UDP协议 TCP可保证数据从一端送至另一端时,能够确实送达,而且抵达的数据的排列顺序和送出时的顺序相…

AWR1642 boost开发板支持的TI参考设计

打开radar_toolbox_1_30_00_05\source\ti\examples\examples_overview,通过输入“1642”查找AWR1642 BOOST支持的参考设计,通过筛选,支持AWR1642 BOOST的参考设计如下: 挑选出两个参考设计上手,一个是“nonos_oob_16xx",不带OS;另一个是”short range radar“,比较…

吹响AI技术应用的号角

毫无疑问,各企业正围绕各种技术展开一场持续不断的角逐,力争率先取得领先且具创新性的技术进步,AI技术也不例外。疫情期间,全球各地企业的员工纷纷转向居家办公。因此,为轻松实现这一转型并建立起远程办公的新常态&…

用23种设计模式打造一个cocos creator的游戏框架----(四)装饰器模式

1、模式标准 模式名称:装饰器模式 模式分类:结构型 模式意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式比生成子类更为灵活。 结构图: 适用于: 当需要给一个对象在运行时添加更…

使用命令行创建vue3项目等待时间长解决方案

问题描述 今天在使用命令行创建vue3项目的时候,发现命令行窗口卡了很久,明明已经更换了安装包的源,并且检查环境变量配置正确的情况下,为什么还要等待那么久呢? 解决方案 使用命令再次检查更换淘宝的源是否配置成功…

混沌映射初始化种群与随机初始化种群初始种群分布图对比

自行切换混沌映射,代码如下: Lb -1; % 搜索空间下界 Ub 1; % 搜索空间上界N_iter 500; % 最大迭代次数 N 30; % 种群个数 dim 2; % 种群维度 Z zeros(N, dim);% 随机生成一个d维向量 Z(1, :) rand(1, dim);% 利用logistic生成N个向量 for i…

C++新经典模板与泛型编程:用成员函数重载实现std::is_convertible

用成员函数重载实现is_convertible C标准库中提供的可变参类模板std::is_convertible,这个类模板的主要能力是判断能否从某个类型隐式地转换到另一个类型,返回的是一个布尔值true或false。例如,一般的从int转换成float或从float转换成int&am…

锁表的原因及解决办法

引言 作为开发人员,我们经常会和数据库打交道。 当我们对数据库进行修改操作的时候,例如添加字段,更新记录等,没有正确评估该表在这一时刻的使用频率,直接进行修改,致使修改操作长时间无法响应&#xff0…

孩子都能学会的FPGA:第二十四课——用FPGA和格雷码实现异步FIFO

(原创声明:该文是作者的原创,面向对象是FPGA入门者,后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门,作者不光让大家知其然,还要让大家知其所以然!每个工程作者都搭建了全自动化的仿…

数据结构 图的广度优先搜索和深度优先搜索

一、广度优先搜索 广度优先搜索等价于树的层次遍历,将起点的每一层进行遍历 当这一层结点全部被遍历完时,再遍历下一层次,从图中可以根据距离遍历起点的长度进行层次选择 例: 以a结点作为开始结点 a的下一层次有b c e三个结点 所以…

GIT GUI使用

文章目录 一、新建本地仓库二、推送(push) 一、新建本地仓库 在空白处右键,找到GIT GUI here, 如果没有仓库,出现的是这样的: 如果有仓库,在本地仓库里打开就是这样的: 新建本地…

Http协议与Tomcat

HTTP协议 HTTP协议(HyperText Transfer Protocol)即超文本传输协议 ,是TCP/IC网络体系结构应用层的一个客户端-服务端协议,是所有客户端,服务端数据传输的基石(数据传输规则) 特点 ⭐基于TCP协…

C++刷题 -- 链表

C刷题 – 链表 文章目录 C刷题 -- 链表1.删除链表的倒数第 N 个结点2.链表相交3.环形链表 1.删除链表的倒数第 N 个结点 https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 快慢指针的应用 fast指针先移动N步,slow依然指向head;然后fa…

算法-01-递归

1-理解递归 斐波那契数列(Fibonacci sequence),又称黄金分割数列 ,以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:1、1、2、3、5、8、13、21、34……特点是 从第三个数开始,第…

C语言指针详解上

1 野指针 int main01(){//野指针就是没有初始化的指针,指针的指向是随机的,不可以 操作野指针//int a 0;//指针p保存的地址一定是定义过的(向系统申请过的)int *p;//野指针*p 200;printf("%d\n",*p);system("pause");return 0;}2 空指针 空指针的作用…

【Spring 源码】 贯穿 Bean 生命周期的核心类之 AbstractAutowireCapableBeanFactory

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…