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%:\.....

  1. nodejs安装完毕后,需要配置环境变量

在PATH中添加:D:\ProgramFiles\nodejs;

  1. appium安装完毕后,需要配置环境变量

D:\ProgramFiles(x86)\Appium\node_modules\.bin;

  1. 配置好后,启动cmd,

输入node-v,查看node安装版本

输入appium-doctor检查appium的安装环境是否成功,

  1. 安装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最新版)

相关推荐
returnthem2 天前
安装Appium
appium
seabirdssss7 天前
Appium 在小米平板上的安装受限与闪退排查
android·appium·电脑
小陈的进阶之路11 天前
Selenium 滑动 vs Appium 滑动
python·selenium·测试工具·appium
小陈的进阶之路11 天前
Appium 自动化测试笔记
笔记·appium
linglan42813 天前
APPium环境配置
appium·自动化
lifewange19 天前
Appium是什么
appium·压力测试
柚子+1 个月前
Appium+python+雷电模拟器自动化测试入门
数据库·python·appium
@Aurora.1 个月前
【GUI自动化测试】--基于QQ音乐项目的GUI自动化测试
appium
楚轩努力变强2 个月前
iOS 自动化环境配置指南 (Appium + WebDriverAgent)
javascript·学习·macos·ios·appium·自动化