尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Appium使用指南与自动化测试案例详解

Appium使用指南与自动化测试案例详解
📅 发布时间:2026/7/1 7:43:37

🍅点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快

1、Appium介绍

  • appium是开源的移动端自动化测试框架;
  • appium可以测试原生的、混合的、以及移动端的web项目;
  • appium可以测试ios,android应用(当然了,还有firefoxos);
  • 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⽀持标准的WebDriverJSONWireProtocol。在这里提供它提供了一套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.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

5.2.2.LaunchDevice

本模块是模拟器设置,针对的是SDK创建的模拟器,不是genymotion等其他模拟器。

LaunchAVD:要启动的模拟器名称。
DeviceReadyTimeout:等待模拟器启动时间。
Arguments:启动模拟器时需要的参数。

5.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()

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

相关新闻

  • 手把手教你用EmEditor和dtc工具拆解Linux设备树dtb文件(附二进制查看技巧)
  • 告别成本超支、回款停滞:易趋助力交付类项目实现业财一体精细化经营
  • 别再问‘服务器能扛多少QPS’了!从4核8G的压测数据,聊聊真实业务场景下的性能估算

最新新闻

  • GitHub Copilot vs Amazon CodeWhisperer:API响应延迟、上下文理解准确率、IDE兼容性三维度硬核拆解(附测试脚本开源)
  • 第6章 学会在 Linux 中“行走“
  • 从Copilot到CodeGen Pro,AI自动写代码的4个认知断层,90%开发者卡在第2层而浑然不知
  • 论文解读:LLM 不直接改代码,也能让程序跑快 3 倍?
  • Pytest数据驱动测试实战:三种主流方案与最佳实践详解
  • Cursor 自动排查 GitHub Actions:CI 失败后,先让智能体完成分诊

日新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号