Java + Selenium + Appium自动化测试

news2024/11/18 3:43:31

一、启动测试机或者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、编写基本代码如下仅供参考:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

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编写正式测试用例并开始执行测试了

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

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

    }

}

【整整200集】超超超详细的Python接口自动化测试进阶教程合集,真实模拟企业项目实战

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

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

相关文章

vit模型

AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 1、问题2、模型结构 1、问题 在视觉方面,注意力要么与卷积网络结合使用,要么用于替代卷积网络的某些组件,同时保持其整体结构不变。 我们证明了这种对CNNs的依赖…

【C#】关于Array.Copy 和 GC

关于Array.Copy 和 GC //一个简单的 数组copy 什么情况下会触发GC呢[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]public static void Copy(Array sourceArray,long sourceIndex,Array destinationArray,long destinationIndex,long length);当源和目…

微服务·架构组件之网关- Spring Cloud Gateway

微服务架构组件之网关- Spring Cloud Gateway 引言 微服务架构已成为构建现代化应用程序的关键范式之一,它将应用程序拆分成多个小型、可独立部署的服务。Spring Cloud Gateway是Spring Cloud生态系统中的一个关键组件,用于构建和管理微服务架构中的网…

芯片方案应用于终端产品时需要哪些技术支持和保障?

在芯片方案应用于终端产品时,客户可能会遇到三大类问题:一是芯片本身的质量缺陷;二是芯片与终端系统软硬件联合调试及验证;三是终端生产。 接下来,小编简短介绍启英泰伦是如何全方位支持客户项目,保障客户…

mac m1 代码调用 Stable Diffusion

from diffusers import DiffusionPipeline import torchpipe DiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5") pipe pipe.to("mps") pipe.enable_attention_slicing()prompt "便利店开业" _ pipe(prompt, num_inferen…

分享一个基于SpringBoot+Vue的房屋在线装修预约系统源码

💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…

python读取.txt文件中某些关键字后面的内容 并根据该数据画图

感谢一下悦姐帮忙 import re#先把文件读进来,用read读入的是字符串,readlines是list with open(resok.txt) as f:txt f.read()dataset r5low:.*|5mix:.*|5normal:.* para rMAE: (.{6})#意思是MAE: 后面的六个东西 row_data re.findall(d…

6个免费图片素材库,高清无水印、无版权

推荐6个免费高清图片素材库,商用也可以,无需担心版权问题,收藏走一波~ 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx 网站主要为新手设计师提供免费素材,这些素材的质量都很高,类别也很多,…

每日一练 | 网络工程师软考真题Day31

阅读以下说明,答复以下【问题1】至【问题7】 【说明】 某网络拓扑结构如图3-1所示。网络A中的DNS_Server1和网络B中的DNS_Server2分别安装有Windows Server 2003并启用了DNS效劳。DNS_Server1中安装有IIS6.0,建立了一个域名为 abc 的Web站点。 图3-1 【…

pytorch再次学习

目录 数据可视化切换设备device定义类打印每层的参数大小自动微分计算梯度禁用梯度追踪优化模型参数 模型保存模型加载 数据可视化 import torch from torch.utils.data import Dataset from torchvision import datasets from torchvision.transforms import ToTensor import…

Nginx中实现自签名SSL证书生成与配置

文章目录 一.相关介绍1.生成步骤2.相关名词介绍 二.Nginx中实现自签名SSL证书生成与配置1.私钥生成2.公钥生成3.生成解密的私钥key4.签名生成证书5.配置证书并验证6.登录 一.相关介绍 1.生成步骤 (1)生成私钥(Private Key)&…

elementUI——el-table自带排序使用问题

问题 排序表格默认第一列按降序排(状态1),当点击其他列后(状态2),改变日期,触发表格数据更新,发现列的排序还点亮在之前的操作上,没有按照默认来(回到状态1&a…

运筹系列85:求解大规模tsp问题的julia代码

1. 大规模tsp问题的挑战 数学模型和精确解法见《运筹系列65:TSP问题的精确求解法概述》和《运筹系列80:使用Julia精确求解tsp问题》: variable(m, x[1:n,1:n], Bin,Symmetric) # 0-1约束 objective(model, Min, sum(x.*distmat)/2) constraint(model, …

Linux——线程详解(一)

索引 初识线程1.inux下的线程2.再谈进程3.理解页表4. 再次理解虚拟到物理的转化 线程的控制1.线程的创建2.线程异常3.验证pthread_join 的第二个参数4.线程的退出方式5. 线程的公有和私有6.pthread_t 与线程独立栈7.线程的局部性存储8.线程分离 初识线程 1.inux下的线程 之前了…

通过RTSP协议接入RTSP流媒体服务器EasyNVR视频监控汇聚平台的设备显示离线是什么原因?

EasyNVR安防视频云服务是基于RTSP/Onvif协议接入的视频平台,可支持将接入的视频流进行全平台、全终端的分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等。平台丰富灵活的视频能力,可应用在智慧校园、智慧工厂、智慧水利等…

028:vue上传解析excel文件,列表中输出内容

第028个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

静态路由 网络实验

静态路由 网络实验 拓扑图初步配置R1 ip 配置R2 ip 配置R3 ip 配置查看当前的路由表信息查看路由表信息配置静态路由测试 拓扑图 需求:实现 ip 192.168.1.1 到 192.168.2.1 的通信。 初步配置 R1 ip 配置 system-view sysname R1 undo info-center enable # 忽略…

超图聚类论文阅读1:Kumar算法

超图聚类论文阅读1:Kumar算法 《超图中模块化的新度量:有效聚类的理论见解和启示》 《A New Measure of Modularity in Hypergraphs: Theoretical Insights and Implications for Effective Clustering》 COMPLEX NETWORKS 2020, SCI 3区 具体实现源码见…

【SWT】 Button 处理 Checkbox 按钮的选中与反选事件

介绍: 在使用 Java SWT(Standard Widget Toolkit)创建图形用户界面时,经常需要处理按钮的选中和反选事件。本文将介绍如何通过添加 SelectionListener 监听器来实现按钮选中与反选事件的处理,并相应地修改相关变量的值…

2023国赛数学建模B题思路分析 - 多波束测线问题

# 1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播, 在不同界面上产生反射, 利用这一原理,从测量船换能器垂直向海底发射声波信 号,并记录从声波发射到…