Java + Selenium + Appium自动化测试

2023-09-18 14:35:35

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

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

三、安装应用到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);    
 
    }
 
}

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

 

更多推荐

LeetCode 1337. The K Weakest Rows in a Matrix【数组,二分,堆,快速选择,排序】1224

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及

STM32F4X UCOSIII 事件集

STM32F4XUCOSIII事件集事件的应用场景UCOSIII事件工作机制UCOSIII事件操作函数事件创建函数事件删除函数事件发送函数事件接收函数UCOSIII事件例程事件在RTOS中也是一种任务间同步的机制,事件不能传递数据。跟信号量不同的是,事件可以实现一对多,多对多的同步,也就是一个事件可以唤醒多个任务,一个

2022/9/13总结

Vue路由的封装抽离为了便于维护,我们通常需要将路由模块抽离出来在vue中,如果要写路径,可以写绝对路径使用@@代表从src目录下去寻找,能避免出现很多错误声明式导航--导航链接vue-router提供了一个全局组件router-link(取代a标签)配置to属指定路径本质是a标签,to无需#优点:能高亮默认会提供高亮

人工智能AI 全栈体系(五)

第一章神经网络是如何实现的为什么使用ReLu函数?五、梯度消失问题1.什么是梯度消失问题?前面我们介绍的BP算法中,是这样更新权重值的:δ∗h=oh(1−oh)∑∗k∈后续(h)δ∗kw∗kh\delta*h=o_h(1-o_h)\sum*{k\in后续(h)}\delta*kw*{kh}δ∗h=oh​(1−oh​)∑

百度SEO优化不稳定的原因分析(提升网站排名的稳定性)

百度SEO优化不稳定介绍蘑菇号-www.mooogu.cnSEO不稳定是指网站在搜索引擎中的排名不稳定,随着时间的推移会发生变化。这种情况可能会出现在网站页面结构、内容质量、外链质量等方面存在缺陷或不合理之处。因此,优化SEO非常重要,可以提高网站的稳定性和排名。掌上帮教-www.zsbjiao.cn百度SEO不稳定因

Unity制作射击游戏案例01

整理逻辑思路://【业务逻辑】这个脚本用来1.控制物体移动旋转(WASD)、2.发射子弹(空格键)//【程序逻辑2】首先检测用户没有按下空格键2.如果按下呢执行发射子弹函数3.克隆子弹4.让克隆的子弹往前跑搭建场景为子弹模板添加刚体,并且限制旋转编写脚本:usingSystem.Collections;usingSys

MySQL 高级语句 Part1(进阶查询语句+MySQL数据库函数+连接查询)

高级语句第一部分一、MySQL进阶查询语句1.1select----显示表格中一个或数个字段的所有数据记录1.2distinct----不显示重复的数据记录1.3where----有条件查询1.4andor----且或1.5in----显示已知的值的数据记录1.6between----显示两个值范围内的数据记录1.7通

网络安全(黑客)自学

前言:作为一个合格的网络安全工程师,应该做到攻守兼备,毕竟知己知彼,才能百战百胜。谈起黑客,可能各位都会想到:盗号,其实不尽然;黑客是一群喜爱研究技术的群体,在黑客圈中,一般分为三大圈:娱乐圈技术圈职业圈。娱乐圈:主要是初中生和高中生较多,玩网恋,人气,空间,建站收徒玩赚钱,技术高的也是有的,只是很少见。技术圈:这个圈

英伟达 nvidia 官方code llama在线使用

新一代编程语言模型CodeLlama面世:重新定义编程的未来随着人工智能和机器学习技术的迅速发展,我们现在迎来了一款革命性的大型编程语言模型——CodeLlama。该模型是基于Llama2研发的,为开放模型中的佼佼者,其性能达到了行业领先水平。模型特点与亮点CodeLlama系列提供多种型号,以满足不同应用的需求。包括

C#流Stream与IO详解(4)——如何更快的读写文件

【前言】在我们追求更快读写速度时,通常都是为了读写二进制文件,而不是文本文件,所以这里只说FileStream、BinaryReader、BinaryWriter的使用。从前文的源码解读中能看到使用BinaryReader和BinaryWriter进行IO读写时本质还是调用了FileStream的接口,所以我们这里只说

从追问AI到人机融合再到人机环境系统智能

人工智能与人类的多元价值对齐是一个复杂而重要的问题。虽然人工智能系统具有强大的计算和学习能力,但它们缺乏人类的情感、道德判断和伦理意识。然而,以下几个方面可以帮助实现人工智能与人类的多元价值对齐:(1)制定明确的伦理框架和规范,对人工智能系统的设计、开发和应用进行指导。这些框架和规范应考虑到人权、公平性、责任、隐私保护

热文推荐