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最新版)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《YOLO算法:基础+进阶+改进》报错解决 专栏答疑

前言:Hello大家好,我是小哥谈。《YOLO算法:基础进阶改进》专栏上线后,部分同学在学习过程中提出了一些问题,笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容,笔者特意推出了该篇…

canvas绘制流动的蚂蚁线(图文示例)

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

汽配企业MES管理系统的特点与实践

随着汽车工业的飞速发展,汽车零部件制造企业面临着日益复杂的生产环境和多样化的市场需求。为了应对这些挑战,许多汽配企业开始引入MES管理系统解决方案,以提高生产效率、优化资源配置、提升产品质量。本文将重点探讨汽配企业MES管理系统的特…

Netty 介绍、使用场景及案例

Netty 介绍、使用场景及案例 1、Netty 介绍 https://github.com/netty/netty Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可扩展的网络服务器和客户端。它是一个开源项目,最初由JBoss公司开发,现在由社区维护。Netty的…

k8s--集群调度(kube-scheduler)

了解kube-scheduler 由之前博客可知kube-scheduler是k8s中master的核心组件之一 scheduler:负责调度资源。把pod调度到node节点。他有两种策略: 预算策略:人为部署,指定node节点去部署新建的pod 优先策略:通过算法选…

怎么做微信秒活动_掀起购物狂潮,引爆品牌影响力

微信秒杀活动:掀起购物狂潮,引爆品牌影响力 在数字化时代,微信已经成为人们日常生活中不可或缺的一部分。作为中国最大的社交媒体平台,微信不仅为人们提供了便捷的通讯方式,还为商家提供了一个广阔的营销舞台。其中&a…

vue3的福音框架arco.design

前言: 在vue2于2023年底正式宣布不在维护,vue3使用越来越频繁的时刻,我们实现项目的辅助框架也越来越多。element, iview, antd 等经典框架继续风靡一时,不过也有很多好的框架,功能也强大,比如我们今天说的…

2.【CPP】入门(宏||内联函数||拷贝构造||析构函数||构造函数)

0x01.引言 1.实现一个宏函数ADD #define ADD(x,y) ((x)(y))//宏是预编译阶段完成替换,注意括号2.宏的优缺点 优点: 1.增强代码的复用性 2.宏函数不用建立栈帧,提高性能 缺点: 1.不方便调试 2.没有安全检查 0x02.内联函数 1.以空…

什么是冒泡排序?如何实现?

一、是什么 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法 冒泡排序的思想就是在每次遍历一遍未排序的数列之后,将一个数据元素浮上去(也就是排好了一个数据) 如同碳酸饮料中二氧化碳的…

摄像头视频录制程序使用教程(Win10)

摄像头视频录制程序-Win10 🥗介绍🍛使用说明🚩config.json 说明🚩启动🚩关闭🚩什么时候开始录制?🚩什么时候触发录制?🚩调参 🥗介绍 检测画面变化…

“数据要素×”行动计划发布,粮食安全监管如何应变?

近日,国家数据局发布“数据要素”三年行动计划(2024-2026年),在“数据要素现代农业“部分提到:提升农业综合生产能力,支持农业生产经营主体和相关服务企业融合利用气象、土壤、农事作业、病虫害、市场等数据…

FineBI实战项目一(17):热门商品Top10分析开发

点击新建组件,创建热门商品Top10组件。 选择柱状图,拖拽cnt(总数)到横轴,拖拽goodName到纵轴。 选择排序规则。 修改横轴和纵轴的标签名称 切换到仪表板,拖拽组件到仪表板 效果如下:

别再纠结,这8款设计工具助你轻松绘制原型图!

原型图设计工具有很多优点。除了帮助设计师快速与客户达成协议,避免项目前景的冲突外,原型图设计工具还可以让客户看到正在创建的内容。如果需要更改,原型图设计工具也可以轻松完成。本文快速总结了8种原型图设计工具。无论你是专业设计师还是…

使用AUTOSAR来开发汽车基础软件的优点

1、高质量。以前我们采用手写代码的方式,是几个工程师在战斗。现在我们采用平台,BSW代码都是供应商提供的,我们相当于后面还有一个团队陪着我们在战斗。 2、低成本。大家都说采用AUTOSAR平台好贵,但是从长远来看是值得的&#xff…

Windows安全基础:认证基础知识

目录 Windows凭据 Windows访问控制模型 访问令牌: 安全标识符(SID): 安全描述符: 令牌安全防御 1、禁止域管理员异机登录 2、开启“审核进程创建”策略 Windows凭据 SSPI(Security Support Provide…

华为ipv4+ipv6双栈加isis多拓扑配置案例

实现效果:sw1中的ipv4和ipv6地址能ping通sw2中的ipv4和ipv6地址 R2-R4为存IPV4连接,其它为ipv6和ipv4双连接 sw1 ipv6 interface Vlanif1 ipv6 enable ip address 10.0.11.1 255.255.255.0 ipv6 address 2001:DB8:11::1/64 interface MEth0/0/1 inter…

登录模块的实现

一.前期的准备工作 1.页面的布局 (1)表单的校验: 利用element-ui提供的文档绑定rules规则后实现校验 (2)跨域的配置 : 利用proxy代理来解决跨域的问题 (3)axios拦截器的配置 两个点:1. 在请求拦截的成功回调中,如果token,因为调用其它的接口需要token才能调取。 在请…

二刷Laravel 教程(用户注册)总结Ⅳ

一、显示用户信息 1)resource Route::resource(users, UsersController); 相当于下面这7个路由 我们先用 Artisan 命令查看目前应用的路由: php artisan route:list 2) compact 方法 //我们将用户对象 $user 通过 compact 方法转化为一个关联…

数据聚合、自动补全、数据同步、es集群

目录 数据聚合 聚合的分类 DSL实现bucket聚合 DSL实现Metrics聚合 RestAPI实现聚合 多条件聚合 带过滤条件的聚合 自动补全 安装拼音分词器 自定义分词器 completion suggester查询 修改索引库数据结构 RestAPI实现自动补全查询 实现搜索框自动补全 数据同步 数…

华为HarmonyOS 创建第一个鸿蒙应用 运行Hello World

使用DevEco Studio创建第一个项目 Hello World 1.创建项目2.预览 Hello World3.安装模拟器4.运行 Hello World 1.创建项目 创建第一个项目,命名为HelloWorld,点击Finish 选择Empty Ability模板,点击Next Hello World 项目已经成功创建…