Appium 自动化测试

1.Appium介绍
1,appium是开源的移动端自动化测试框架;
2,appium可以测试原生的、混合的、以及移动端的web项目;
3,appium可以测试ios,android应用(当然了,还有firefoxos);
4,appium是跨平台的,可以用在osx,windows以及linux桌面系统上;
2.Appium基本原理
在Android端,appium基于WebDriver协议,利用Bootstrap.jar,最后通过调⽤
用UiAutomator的命令,实现App的自动化测试。
UiAutomator测试框架是AndroidSDK自带的AppUI自动化测试Java库。
另外由于UiAutomator对H5的支持有限,appium引入了chromedriver以及
safaridriver等来实现基于H5的自动化。

2.1.appium在android端工作流
1.client端也就是我们testscript是我们的webdriver测试脚本。
2.中间是起的Appium的服务,Appium在服务端起了一个Server(4723端口),
跟seleniumWebdriver测试框架类似,Appium⽀持标准的WebDriver
JSONWireProtocol。在这里提供它提供了一套REST的接口,AppiumServer接
收webdriverclient标准rest请求,解析请求内容,调⽤用对应的框架响应
操作。
3.appiumserver会把请求转发给中间件Bootstrap.jar,它是用java写的,安装
在手机上.Bootstrap监听4724端口并接收appium的命令,最终通过调⽤用
UiAutomator的命令来实现。
4.最后Bootstrap将执行的结果返回给appiumserver。
5.appiumserver再将结果返回给appiumclient。

3.Appium安装配置
3.1.限制
如果你在windows上安装appium,你没法使用预编译专用于OSX的.app文件,
你也将不能测试IOSapps,因为appium依赖OSX专用的库来支持IOS测试。这
意味着你只能通过在mac上来运行IOS的app测试。这点限制挺大。
3.2.傻瓜式安装node.js

 3.2.1.查看是否安装成功

nodejs安装完毕后,需要配置环境变量
在PATH中添加:D:\ProgramFiles\nodejs;

3.3.傻瓜式安装Appium

 3.3.1.成功界面

 3.4.配置appium环境变量

D:\Appium\node_modules\.bin

3.5.打开控制台,查看appium环境
3.5.1.appium-doctor

3.6.配置Android—环境变量

D:\androidSDK

3.7.Python中配置appium环境(联网)
进入:D:\python\Scripts
打开控制台:
pipinstallAppium-Python-client

3.8.总结:
1) androidsdk安装完毕后,需要配置环境变量
新建ANDROID_HOME
在PATH中添加:%ANDROID_HOME%:\.....
2) nodejs安装完毕后,需要配置环境变量
在PATH中添加:D:\ProgramFiles\nodejs;
3) appium安装完毕后,需要配置环境变量
D:\ProgramFiles(x86)\Appium\node_modules\.bin;
4) 配置好后,启动cmd,
输入node-v,查看node安装版本
输入appium-doctor检查appium的安装环境是否成功,
5) 安装Python,配置环境变量

4.第一个脚本示例
4.1.首先通过eclpse启动android模拟器

 4.2.启动Appium

4.3.点击左上角有“机器人”的按钮:
选择你的android版本

 4.4.点击右上角的“三角”按钮启动Appium。

 

4.5.通过Python编写自动化测试脚本。
desired_caps是一个字典,用于在appiumserver与手机端建立会话关系时,手
机端需要告诉服务端设备相关的一些参数,根据这些参数服务端可以做出相应的
处理。

 4.6.画出来的这三个,是需要在脚本中正确填写的

 4.7.执行效果

5.Appium界面内容解析
5.1.整体介绍
主页面顶部从左到右依次是:
1、AndroidSettings:android相关的设置
2、GeneralSettings:全局设置,设置appium相关的内容
3、DeveloperSettings:开发者设置,一般不用需要关心
4、About:appium相关信息,不需要关心
5、Inspector:查找元素用的,windows无法使用,MAC可以使用,windows可
以不用关心。
6、LaunchAppium:启动appium按钮
7、右下角清除日志按钮。

5.2.AndroidSettings
此页面分为Application、La、、四部分,先看图
之后分析分别有什么作用

5.2.1.1、Application
本模块设置被测试app信息,如安装包路径、包名、activity等
ApplicationPath:选择要测试的apk,选择他后与全局设置中的
Pre-LaunchApplication配合,启动appium时会先把apk安装到手机(或模拟器)
再启动app。
Package:根据apk生成的app包名,之前提到过的,我们这个包的身份证,我

们需要通过这个去找到包,不然我们安装后我们通过什么去辨别这些包呢?
WaitforPackage:等待包名。

LaunchActivityactivityActivity
就是其中的一个个网页,我们启动app时需要去运行的activity,这里我们填写
首次启动页面的activity。我们选择第一启动的activity与aapt命令生成的
launchable-activity:name一致

WaitforActivity:和上面的差不多,意思是等待某个Activity打开,用的时间不是
很多,做了解。
UseBrowser:测试浏览器选择这项,与前五项互逆。及选择了他前五个就不可以
选择。
FullReset:将所有设置复位。即将手机(模拟器)恢复到启动到appium前的状

NoReset:不需要重置手机(模拟器)中的app

6.2.2.LaunchDevice
本模块是模拟器设置,针对的是SDK创建的模拟器,不是genymotion等其
他模拟器。
LaunchAVD:要启动的模拟器名称。
DeviceReadyTimeout:等待模拟器启动时间。
Arguments:启动模拟器时需要的参数。
6.2.3.Capabilities
运行测试的相关信息。
PlatformName:测试平台,可以选择Android、FireFoxOS、MAC版的还可以选择
IOS。

PlatformVersion:被测试手机(模拟器)版本。
DeviceName:设备名称,手机连接电脑后打开cmd输入adbdevices可获取。
Language:被测试手机(模拟器)使用语言。
Locale:被测试手机(模拟器)所属区域。

5.4.元素侦测:
这个按钮的功能和firebug的定位工具功能类似,但是他还有一个功能,他会检
测你的各个系统配置是否正确,如果前面各项参数不正确时,使用该功能会报错。
如果你不正常连接手机也不行。还是建议用sdk工具里面自带的
uiautomatorviewer。
5.5.启动服务
所有参数配置好后你需要做的就是启动appium服务,只有启动之后你才能够做
自动化。
5.6.清除日志(右下角):
在写脚本、调试过程中会产生很多的日志,但是你可能想看的只是中间某个时间
段的,那么你在这个时候可以将页面的日志清除。

6.Appium查看界面元素的工具
6.1.通过androidsdk的uiautomaterviewer获取元
素内容

 

uiautomatorviewer.bat是一个用来来扫描和分析Android应用程序的UI组件的
GUI工具。具体使用方法可参考。打开uiautomatorviewer以后,可以看到
uiautomatorviewer已经将模拟器的图形展示在上面了。

 6.2.右侧xml节点详解

 

7.获取appPackage和appActivity
appPackage和appActivity进行appium自动化测试非常重要的两个参数,
我们所测试的APP不同,这两个参数肯定也是不一样的。那如何快速的获取这
APP的这两个参数呢

7.1.方法一:通过cmd指令来获取

1.adbshell
2.dumpsysactivity|grepmFocusedActivity

3、adbshelldumpsysactivityactivities

7.2.方法二:使用Appium来获取
进入设置页,选择APK路径,下面就会显示包名和Activity名称

8.Appium常用定位方法讲解
对象定位是自动化测试中很关键的一步,也可以说是最关键的一步,毕竟你对象
都没定位那么你想操作也不行,下面我们来看我们常用的一些定位方式。

8.1.ID定位(取resource-id的值):
无论是在web自动化还是app自动化中id都是唯一的,可能有的小伙伴看
到这里会有疑问,因为有的资料说是通过name定位是唯一的,为什么你这里是
id呢,其实这个在之前是不冲突的,但是如果你用的是appium较新版本是不行
的,在新版本中name定位被去掉了,所以在以后的定位中不会有name定位了,
通常情况下我们也更喜欢用id进行定位。这里可能刚学的小伙伴会有疑问,
有的时候你的应用为什么没有id,或者说在这个手机上有但是另外的手机上
没有。1、开发没有添加。2、android版本是4.4以下的。
如果我们需要对“7”这个数字进行点击操作,
driver.find_element_by_id("com.android.calculator2:id/digit7").click() 

8.3.className定位(取class的内容)
在实际工作中className定位用得相对而言会比较少。当你经常去看class
时你会发现很多的className是一样的,你没有办法对其进行唯一定位,下面我
们看下面两张图片

driver.find_element_by_class_name("android.widget.EditText").send_keys("111111")
这种方式去定位,你会发现你永远定位不了密码栏,这是为什么呢?因为在设计
的时候如果你查找的元素在页面有多个,系统会自动给你选择第一个,所以你永
远操作不了后面的

8.4.text定位(需要使用uiautomator的定位方式,
使用text的内容)

使用这里需要注意一下,如果通过text定位的结果是个list,不能直接click。所
以如果要点击需要取数组的值,比如下面是点击找到的第一个元素

 8.5.xpath定位

xpath定位在web自动化中是最常见的,而且也是最有效的,使用xpath定
位避免了找不到元素导致报错的问题,但是在app中使用xpath定位是一件很low
的事情。只要遇见使用xpath定位元素他的反应就会比较慢,自动化的目的是为
了提高效率,但是使用xpath后会降低效率,所以这里说很low

 driver.find_element_by_xpath("//android.widget.TextView[@text='JavaScript']").click()

在xpath里面我们的语法是这样“//android.widget.TextView[@text='JavaScript']”,
这个和我们之前web的xpath一样,意思是查找所有节点中节点为
android.widget.TextView(这里使用的是className,也可以使用id,系统会依次
去找)并且他的text属性值为JavaScript,这样是否更容易理解呢?下来多练习。
这样的定位方式不推荐,效率很慢。

8.6.css_selector定位(webview)--加载网页--css
只适用于webview的html页面,继承自webdriver,与pc版本的UI测试一致
driver.find_element_by_css_selector()
8.7.link_text定位(webview)
只适用于webview容器中的html页面,继承自webdriver,与pc版本的UI测试
一致
driver.find_element_by_link_text()

8.8.源代码

10.Appium操作界面之触摸操作(了解)
10.1.规范中的可用事件有:
*短按(press)
*释放(release)
*移动到(moveTo)
*点击(tap)
*等待(wait)
*长按(longPress)
*取消(cancel)
*执行(perform)

10.2.单点触摸TouchAction(driver)
通过TouchAction对象,添加tap、move_to等操作,然后perform()执行,可以
实现解锁屏幕等功能
action=TouchAction(driver)
action.press(x=220,y=700).move_to(x=840,y=700).move_to(x=220,
y=1530).move_to(x=840,y=1530).release().perform()
10.3.多点触控MultiAction()
通过MultiAction().add()添加多个TouchAction操作,最后调用perform()一起执行
这些操作
举例
action0=TouchAction().tap(el)
action1=TouchAction().tap(el)
MultiAction().add(action0).add(action1).perform()
10.4.滑动driver.swipe(x1,y1,x2,y2,duration)
命令解释:从坐标(x1,x2)滑动到坐标(x2,y2),duration非必填项,滑动时间(滑
动时中间要加等待时间,不加等待时间容易出错,而且加等待时间的长短也要掌
握好,一般在200-1000毫秒之间应该差不多,自己调试几次感觉一下哪个时间
比较稳,每个程序可能会有所差异)
滑动的坐标不能超过屏幕的宽高
可以通过【driver.get_window_size()】命令获得窗口高和宽{'width':1080,'height':
1788}
#获得机器屏幕大小x,y
defgetSize(driver):
x=driver.get_window_size()['width']
y=driver.get_window_size()['height']
return(x,y)

#屏幕向上滑动
defswipeUp(driver,t=500):
l=getSize(driver)
x1=int(l[0]*0.5)#x坐标
y1=int(l[1]*0.75)#起始y坐标
y2=int(l[1]*0.25)#终点y坐标
driver.swipe(x1,y1,x1,y2,t)
#屏幕向下滑动
defswipeDown(driver,t=500):
l=getSize(driver)
x1=int(l[0]*0.5)#x坐标
y1=int(l[1]*0.25)#起始y坐标
y2=int(l[1]*0.75)#终点y坐标
driver.swipe(x1,y1,x1,y2,t)
#屏幕向左滑动
defswipLeft(driver,t=500):
l=getSize(driver)
x1=int(l[0]*0.75)
y1=int(l[1]*0.5)
x2=int(l[0]*0.05)
driver.swipe(x1,y1,x2,y1,t)

#屏幕向右滑动
defswipRight(driver,t=500):
l=getSize(driver)
x1=int(l[0]*0.05)
y1=int(l[1]*0.5)
x2=int(l[0]*0.75)
driver.swipe(x1,y1,x2,y1,t)

10.5.长按示例

10.6.2.打开界面,使用如下指令,查看activity和package

 10.6.3.编写python脚本代码

 

 11.系统按键事件(了解)

press_keycode(AndroidKeyCode)#发送按键事件

例如:点击home键,home键的KeyCode是3

12.driver的一些比较重要操作
12.1.reset()
#重置app#这时候driver会重置,相当于卸载重装应用。所以本地缓存会失效

driver.reset()

12.2.start_activity(包名,activity名)
例如:
#启动app的某一个activity

启动一个activity,这个activity必须是AndroidManifest.xml中有intent-filter的
activity,对于其他的activity需要程序跳转过去

12.3.scroll(起始元素,结束元素)

driver.scroll(origin_el,destination_el)

12.4.获得当前页面的所有元素

 driver.page_source

这可以用来判断元素是否存在,例如(assert“发布成功”indriver.page_source)

12.5.补充一些driver启动时可能用到的项(了解)
其实这些在上一篇启动里都有介绍,但是有些可能大家没注意到的点再列一下。
这些点也是我在测试中实际遇到的点
autoLaunch:Appium是否要自动启动或安装app,默认true
desired_caps[‘autoLaunch’]=‘false’
有的时候我不想让appium每次都启动app,想自己去启动activity,那这个项
这时就可以起作用了
noReset:在会话前是否重置app状态。默认是false
desired_caps[‘noReset’]=‘true’
newCommandTimeout:设置未接收到新命令的超时时间,默认60s
如果60s内没有接收到新命令,appium会自动断开连接,如果我需要很长时间
做driver之外的操作,可能延长接收新命令的超时时间
desired_caps[“newCommandTimeout”]=1800

13.自动化测试简单案例-登录

 13.1.打开UIAutomatorViewer

 

 13.2.代码实现

driver.find_element_by_id("com.example.login:id/et_username").send_keys("hello");

driver.find_element_by_id("com.example.login:id/et_password").send_keys("123");

driver.find_elements_by_class_name("android.widget.Button")[1].click()

14.自动化测试案例2-转转
14.1.下载转转,并打开,在初始界面查看包和
activity

14.2.使用UIAutomatorViewer查看转转按钮
14.3.点击跳过

#强制等待3秒钟
time.sleep(3)
#跳过按钮
#driver.find_element_by_id("com.wuba.zhuanzhuan:id/arw").click()

14.4.点击分类

driver.implicitly_wait(10)
#分类按钮
driver.find_element_by_id("com.wuba.zhuanzhuan:id/b1v").click()

driver.implicitly_wait(10)
#搜索按钮
driver.find_element_by_id("com.wuba.zhuanzhuan:id/b1p").click()

driver.implicitly_wait(10)
#搜索框中输入搜索内容
driver.find_element_by_id("com.wuba.zhuanzhuan:id/mg").send_keys(u"电动车")
time.sleep(10)
#点击搜索

driver.find_element_by_id("com.wuba.zhuanzhuan:id/mi").click()
driver.quit()

15.启信宝案例
#coding:utf-8
fromappiumimportwebdriver
#desired_caps是一个字典
desired_caps={}
#你要测试的手机操作系统
desired_caps['platformName']='Android'
#手机操作系统的版本
desired_caps['platformVersion']='7.0'
#使用的手机类型或模拟器类型
desired_caps['deviceName']='XPUDU17113015063'
#deviceName你的模拟器名字,就是在下载AVD的时候,你填写的,忘
了的回头去找,或者在模拟器顶部会显示
#所运行的app包名
desired_caps['appPackage']='com.bertadata.qxb'
#app运行的事件
desired_caps['appActivity']='.activity.SplashActivity'
#启动打开app
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',
desired_caps)
#根据元素定位,执行点击操作
driver.implicitly_wait(10)
serh=
driver.find_element_by_id("com.bertadata.qxb:id/tv_home_searc
h_desc")
serh.click()
driver.find_element_by_id("com.bertadata.qxb:id/et_search_con
tent").send_keys("优思安科技")
driver.quit()

Python接口自动化测试零基础入门到精通(2024最新版)

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

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

相关文章

确定了!软考中级「集成」、「监理」新版教程有哪些变化?

新版教程改了哪些内容?2024上半年软考应该如何备考? 准备考24年上集成的朋友们,先不要慌!备考脚步不要乱,改版可能还是好事呢,难度可能会降点? 2024年教程改版科目: ✔软考中级-集…

C++学习笔记(二十)

一、stack容器 1. stack基本概念 概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口 栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为 栈中进入数据称为 —— 入栈 push 栈中弹出数据称…

章鱼网络 2023 年全回顾|暨12月进展报告

2023年,章鱼网络轻装上阵,身处加密行业的低谷中砥砺前行。 12月17日,经过整整1年时间的开发和打磨,章鱼网络在重磅上线 Octopus 2.0,即 $NEAR Restaking 和 NEAR-IBC,获得了社区和市场的一致认可&#xff…

Keil错误和警告合集+解决办法(持续更新)

文章目录 前言一、变量声明类型错误?error: #20: identifier "uint16_t" is undefined解决办法error: #256: invalid redeclaration of type name "GPIO_TypeDef" (declared at line 50)解决办法 二、警告main.c(24): warning: #223-D: functio…

PCL 读取TXT的点云数据

目录 一、 算法概述二、代码实现三、测试示例一、 算法概述 适用:读取TXT格式的点云数据。(效率已做优化,读取并解析45万行点云仅用时0.6s)。 本文以空格分割的点云数据为例,点云存储格式如下所示: 二、代码实现 #include <string> #include <iostream>

MySQL基础笔记(3)DML数据操作语句

顾名思义&#xff0c;全称是数据操作语言&#xff0c;用来对数据库中表的数据记录进行增删改操作~ 目录 一.添加数据 1.给指定字段添加数据 2.给全部字段添加数据 3.批量添加数据 二.修改数据 三.删除数据 一.添加数据 1.给指定字段添加数据 insert into 表名 (字段名…

M-G370PDF1(IMU)

一般描述 M-G370PDF1是一个小的形状因子惯性测量单元&#xff08;IMU&#xff09;&#xff0c;具有6个自由度&#xff1a;三轴角速率和线性加速度&#xff0c;并提供了高稳定性和高精度的测量能力与使用 高精度补偿技术。各种校准参数被存储在IMU的存储器中&#xff0c;并且是…

深入了解ISO 8601:日期和时间的国际标准化

深入了解ISO 8601&#xff1a;日期和时间的国际标准化 导言 在数字化时代&#xff0c;日期和时间信息的处理变得日益重要&#xff0c;涉及到计算机系统、数据交换、国际协调等方面。为了统一全球对日期和时间的表示方法&#xff0c;国际标准化组织&#xff08;ISO&#xff09;…

ABeam×StartUp丨ABeam旗下德硕管理咨询(深圳)新创部门拜访「光子晶体科技」

光子晶体科技 ABeamStartUp 光子透明芯片 显示技术 光学材料 近日&#xff0c;ABeam 旗下德硕管理咨询&#xff08;深圳&#xff09;有限公司&#xff08;以下简称“ABeam-SZ”&#xff09;新创部门一行拜访了深圳光子晶体科技有限公司&#xff08;以下简称“光子晶体科技”…

统信uos 相关问题解决笔记

一、统信uos 专业版启用root账号登陆&#xff0c;及开启复制粘贴快捷键 通信uos 专业版启用root账户 1) 通信启动root账号登陆 https://blog.csdn.net/qq_43765296/article/details/129818323 激活选择在线登陆&#xff1a;微信扫码就行 2&#xff09;开启复制粘贴按键&#…

基于JAVA+ssm开发的中草药智能采购管理系统设计与实现【附源码】

基于JAVAssm开发的中草药智能采购管理系统设计与实现【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.…

爬虫逆向破解翻译接口参数

Python 请求baidu翻译接口&#xff1a;https://fanyi.baidu.com/v2transapi?fromzh&toen 步骤一&#xff1a; 查找构建请求参数 JS 断点发现如下参数&#xff1a; w {from: _.fromLang,to: _.toLang,query: e,transtype: i,simple_means_flag: 3,sign: b(e),token: windo…

C++核心编程——类和对象

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…

Android DataStore:安全存储和轻松管理数据

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、使用 3.1 Preferences DataStore 添加依赖数…

Python面向对象之继承

【 一 】什么是继承&#xff08;Inheritance&#xff09; 继承允许创建一个新类&#xff08;称为子类或派生类&#xff09;&#xff0c;从已存在的类&#xff08;称为父类或基类&#xff09;继承属性和方法。子类可以继承父类的特性&#xff0c;并可以通过添加新的属性和方法来…

JVM基础(5)——JVM垃圾回收算法

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

HarmonyOS应用开发学习笔记 UI布局学习 创建轮播(Swiper) artTS 轮播组件 简单使用

官方文档 Swiper组件提供滑动轮播显示的能力。Swiper本身是一个容器组件&#xff0c;当设置了多个子组件后&#xff0c;可以对这些子组件进行轮播显示。通常&#xff0c;在一些应用首页显示推荐的内容时&#xff0c;需要用到轮播显示的能力。 1、简单用法 loop 控制是否循环 …

TS 36.331 V12.0.0-过程(4)-测量

​本文的内容主要涉及TS 36.331&#xff0c;版本是C00&#xff0c;也就是V12.0.0。

SVG 绘制基本的几何图形

SVG 绘制基本的几何图形 简介SVG 是什么SVG 的优点一个简单的例子 SVG 基本图形矩形 rect圆形 circle椭圆 ellipse线条 line多边形 polygon折线 polyline路径 path 简介 SVG 是什么 SVG 全称为 Scalable Vector Graphics&#xff0c;即可缩放矢量图形。SVG 使用 XML 格式定义…

【OpenCV学习笔记08】- 图像基本操作

关于 OpenCV 官方文档的 GUI功能告一段落&#xff0c;接下来开始核心操作的学习。学习笔记中会记录官方给出的例子&#xff0c;也会给出自己根据官方的例子完成的更改代码&#xff0c;同样彩蛋的实现也会结合多个知识点一起实现一些小功能&#xff0c;来帮助我们对学会的知识点…