appium测试安卓app记录

一、基本概述

appium的核心是暴露的一系列REST API的server。
server监听一个端口,接收由client发送来的command,翻译这些command转换为移动设备可以理解的形式发送给设备,移动设备执行完这些command会把执行结果返回给appium server,appium server再把执行结果返回给client。
client即发送command的设备,即client是发送代码的客户端,代码可以是java/ruby/js,只要实现了webdriver标准协议就可。

1.1 session

session即会话,在webdriver/appium,所有工作在session start后才可以进行的,通过POST/seesion这个URL,传入Desired Capabilities就可以开启session.
开启session后,会返回一个全局唯一的session id,以后所有请求都会带上该session id,这个id代表了打开的浏览器或者移动设备(真机或者模拟器)。
****由于session id是唯一的,那么在同一台机器上启动多个session就变为可能,即分布式的理论依据—selenium grid.
如上图,POST都带了session id

1.2 appium server

可以直接用npm安装appium,也可以用desktop版本(GUI),里面还带了inspect,inspect可以查看元素定位,类似uiatomatorviewer.bat,inspect可以输入自己的定位值来校验是否定位准确。android用的是appium.exe,IOS用的是appium.app。
appium server命令行启动的安装方法参考官方文档:

https://github.com/appium/appium/blob/master/docs/en/about-appium/getting-started.md

1.3 环境准备

需要安装环境如下:
1、adbroid sdk
因为运行的时候依赖sdk中的android的工具,设置环境变量ANDROID_HOME(android sdk路径),tools和platform-tools加入系统变量path
2、安装JDK
3、安装appium(desktop直接去官网下载安装即可;命令行模式的安装nodejs,npm install -g appium安装)
3、安装client库,python的库为Appium-Python-Client
4、如果用pytest可以安装allure生成报告,如果是unittest可用htmlTestRunner.py生成报告
5、如果要运行脚本,需要启动一个模拟器或者使用真机,模拟器推荐可以用夜神、安卓自带的模拟器,MUMU等。夜神模拟器运行的时候adb替换为安卓SDK的adb。
6、运行appium,直接打开appium desktop选择启动,或者直接在命令行启动appium

二、appium

1、appium desired capabilities

desired capabilities是一组键值对,appium clients和server之间创建session需要的信息存放在这个键值对,appium client以JSON形式发送给server,告诉server需要的test的信息。desired capabilities可以设置在代码里,也可以设置在appium启动的时候带的参数。
for example:
{“platformName”:“android”,“platformVersion”:“5.1”,“deviceName”:“127.0.0.1:62001”,“app”:"/path/to/my.app"}
这个配置是告诉
appium当前的设备是安卓系统,版本是5.1,app信息等
**注意运行前需要adb devices查看设备的信息和设备名字,window系统需要adb connect 127.0.0.1:62001
下述接受一些相关的配置信息:
automationName------默认是appium或者UiAutomator2,支持Espresso,UiAutomator1,支持IOS的为XCUITest或者Instruments等,也支持自己定义的驱动。
platformName—移动设备的系统,ios/android/firefoxOs
platformVersion—移动设备系统版本号
deviceName—设备的名字,可以用adb devices查看设备Name
app----本地或者一个http url的app路径,配置该项的时候,首次运行appium会安装该app,另外这个特性如果配置了appPackage和appActivity就不需要,二者配一个即可。
otherApps–APP LIST,e.g., “/path/to/app.apk”, https://www.example.com/url/to/app.apk, [“http://appium.github.io/appium/assets/TestApp9.4.app.zip”, “/path/to/app-b.app”],不支持automationName=Espresso和IOS真机
browserName—设备的web browser名字,如果测试app则不需要配置该项 safrai\chrome\chromium\Browser
newComandTimeout–默认是60s,即appium如果60s没收到命令的话会自动把session停止,如果想拉长这个时间需要设置该值
udid–唯一的设备标识
autoWebciew—自动进入webView context,默认是false,如果不设置需要命令进入webView
noReset—启动会话的时候不重启app
fullRest–进行完全的重启
enablePerformanceLogging—启动的是浏览器(web/webView)打开日志
printPageSourceOnFindFailure–当查找失败的时候,直接打印当前的page source

settings[settingskey]—创建会话时更新appium setting,e.g., ‘settings[mjpegScalingFactor]’: 10, ‘settings[shouldUseCompactResponses]’: true
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

1.1安卓特有的一些配置

appActivity—启动的时候启动到的APP的页面
appPackage—想要run的app的包名
androidInstallTimeout—等待apk安装的超时时间,默认时90s
androidInstallPath—等待安装的apk需要push的路径
adbport—连接adb的端口,默认5037
systemport—连接appium-uiautomator2-server的端口,默认时8200,然后选择8200~8299之间任意一个for appium-uiautomator2-server,8300~8399 for appium-expresso-driver,测试的时候注意调整避免冲突
remoteAdbHost—远程操作的adb设备地址
chromedriverExecutable----测试设备浏览器,driver驱动要和浏览器的版本匹配
autoWebviewTimeout—等待webview时间,默认时2000ms
donStopAppOnReset—不结束正在测试的APP的进程,默认时false
unicodeKeyboard—使能unicode输入,默认false
resetKeyboard–重置输入法为默认,一般时跑了unicode输入的test,单独使用的话就忽略,默认false
chromeOptions—设置ChromeDriver,同selenium那边的用法
adbExecTimeout–adb命令执行结果超时时间,默认2000ms
skipDeviceInitialization—跳过设备的初始化,例如app settings或者一些权限的设置等,可以提升启动速度,默认是false
skipServerInstallation—跳过uiAutomator2 server的安装,可以提升启动性能,前提是设备上已经安装,默认false
*****这些是在官网上查看的一些,只用过部分,想要看完整的请参考https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md

1.2 IOS的配置

-待补充-

2、获取appActivity和appPackage

adb connect 127.0.0.1:62001—连接真机或者模拟器
adb shell dumpsys activity activities | grep mFocusedActivity
adb shell dumpsysy activity activities | grep mResumedActivity
使用window系统则把grep更换为findstr

C:\Users\18566>adb shell dumpsys activity activities | findstr mResumedActivity
    mResumedActivity: ActivityRecord{14c41ad6 u0 com.tencent.wework/.launch.WwMainActivity t10}

C:\Users\18566>adb shell dumpsys activity activities | findstr mFocusedActivity
  mFocusedActivity: ActivityRecord{3599cf24 u0 com.vphone.launcher/.Launcher t1}

如上图,模拟器版本是5.1.1,查看到方法1是8.0以上,方法2是8.0版本,目前看mResumedAcitivity比较靠谱
另外定位元素的工具appium inspect,uiautomatorViewer都可以看到包名和页面名
com.tencent.wework/.launch.WwMainActivity,appPackage/appActivity

3、appium定位方法

同webdriver,xpath、id(定位显示的resource-id)等,在这些的基础扩展了以下几个方法:

1、accessibility_id

find_element_by_accessibility_id/find_elements_by_accessibility_id
参数使用content-desc的值

2、android_uiautomator

find_element_by_android_uiautomator/find_elements_by_android_uiautomator
参考:https://developer.android.com/reference/android/support/test/uiautomator/UiSelector.html
find_element_by_android_uiautomator(‘new UiSelector().clickable(true)’)
官网解释见下图:
在这里插入图片描述

3、UiSelector类介绍

功能:通过各种属性与节点关系定位组键,找到对象然后操作对象
new UiSelector().text(“点击”),定位到text属性是“点击”的元素对象
new UiSelector().textContains(“成功”) 定位到text属性包含“成功”的元素对象
new UiSelector().textMathes(“xxx”)//符合正则表达式的元素
new UiSlector().textStartsWith(“阿”),定位text属性以“阿”开头的元素对象
***中文查找,如果遇到错误“UiOjbectNotFoundException” ,需要把项目编码格式修改为UTF-8
new UiSelector().description(“xxx”)
new UiSelector().descriptionContains(“xxx”)
new UiSelector().descriptionMatches(“xxx”)//里边是正则表达式
new UiSelector().descriptionStartsWith(“xxx”)
这个是以空间Content-desc属性构造

new UiSelector().resourceid()
new UiSelector().className()
new UiSelector().instance(int instance)
举例如上述,更多详细的方法见上述官网地址进行了解

4、UiScrollable介绍

uiscrollable是专门处理滚动时间的类,提供各种滚动方法。
滚动步长设置的越长,滑动越慢。扫动也就是滑动,扫动几次就是滑动几次。

-findBackward(),以步长为5快速向上(后)滑动
-findForward(),以步长为5快速向下(前)滑动
滚动到某个对象:
scrollIntoView(UiSelector selector)滚动到条件元素所在位置,并且尽量让其居中央

用法具体:
‘new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text(“添加成员”).instance(0));’
通过instance的方法来进行选择操作时,只有在某一界面没办法通过唯一属性进行确认控件的才使用该方法
uiautomator view工具可以看到Scrollable属性是true代表可以支持滑动,false代表不支持滑动
object1=new UiSelector().scrollable(true).instance(0),找到可以滑动的元素第一个
object2=new UiSelector().text(“添加成员”)
滑动到元素
objiect1.scollIntoView(object2).click(),滑动到元素并点击
***更多的参考官方文档

4、appium应用

4.1appium API 之上下文操作

上下文操作主要针对的是混合应用(APP嵌套网页)
1、获取当前所有上下文,最开始启动的时候系统有一个Native上下文
driver.contexts
2、当前页面
driver.contexts()[-1]
3、切换上下文
driver.swicth_to.context(driver.contexts()[-2])
4、切回最开始的安卓页面
driver.switch_to.context(‘NATIVE_APP’)

-----后续待补充

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值