App自动化测试|Appium工作原理及Desired Capbilities配置
Appium工作原理及Desired Capbilities配置
Appium工作原理
脚本请求——>4723端口appium server——>解析参数给PC端4724端口——>发送给设备4724端口——>通过设备4724端口发给bootstrap.jar——>Bootstrap.jar把命令发给uiautomator
- JsonWireProtocol:它是一种协议,遵循REST风格,以JSON方法进行传输,是一系列的键值对,遵循W3C WebDriver Spec设计风格;appium中的Json wire protocol继承自selenium的webdriver wire protocol,并进行了扩展,使得Json wire protocol能够控制不同的移动设备的行为。
- bootstrap:bootstrap在appium中是以jar包的形式存在的,它的功能是作为一个socket服务,把Appium sever发送的请求转化成uiautomator的命令来让uiautomator进行处理。 在创建session成功之前,appium就已将bootstrap.jar放入手机中,并开启设备上的基于appiumbootstrap的socket服务,绑定本机和boostrap通信的端口号4724用于和Android设备通讯,默认监听4724端口,等待client的连接。
- Uiautomator:UiAutomator是Google提供的用来做安卓自动化测试的一个Java库,基于Accessibility服务。功能很强,可以对第三方App进行测试。它的初始版本发布在Android4.3(APIlevel18)及以上的android系统版本。
- Selendroid:Selendroid和UiAutomator类似,也是Google提供的一个安卓自动化测试软件,适用于Android系统的本地应用程序和移动web的UI混合测试。它主要应用在Android4.2(APIlevel17)及以下的android系统版本。
- Instruments:Instruments一个很灵活的、强大的工具,是性能分析、动态跟踪和分析OSX以及iOS代码的测试工具,appiumios封装了apple的Instruments框架,主要使用Instruments里的UIAutomation(Apple的自动化测试框架),然后在设备中注入入bootstrap.js进行行监听。
Desired Capabilities配置
Desired Capabilities携带了一些配置信息。从本质上讲,它是key-value形式的对象。可以理解成是java里的map,python里的字典,ruby里的hash以及js里的json对象。实际上Desired Capabilities在传输时就是json对象。
DesiredCapabilities最重要的作用是告诉appium server本次测试的上下文。
比如:
- 本次测试是启动浏览器还是启动移动设备?
- 是启动andorid还是启动ios?
- 启动android时,app的package是什么?
- 启动android时,app的activity是什么?
appium server的这些疑问Desired Capabilities都必须给予解答,否则appium server就无法完成移动app或者是浏览器的启动。
Desired Capabilities常用键值对介绍:
automationName:使用哪种自动化引擎。appium(默认)还是Selendroid。
platformName:平台的名称,iOS,Android,FirefoxOS
platformVersion:移动设备的系统版本号,7.1,4.4
deviceName:设备名称,Android:可随意填写;IOS:instruments -s devices
udid:连接的物理设备的唯一设备标识adb devices可获取
app:本地绝对路径_或_远程httpURL所指向的一个安装包(.ipa,.apk,或.zip文件)。Appium将其安装到合适的设备上。如果指定了appPackage和appActivity参数,Android则不需要此参数了。该参数也与browserName不兼容。(一般和noSign属性一起使用)
browserName:测试的H5 web浏览器,如果是测app则忽略
newCommandTimeout:用于客户端在退出或者结束session之前,Appium等待客户端发送一条新命令所花费的时间(秒为单位)
noReset:在当前session前不重置app状态,默认值为false
fullReset:(iOS)删除所有的模拟器文件夹。(Android)要清除app里的数据,请将应用卸载才能达到重置应用的效果。在Android,在session完成之后也会将应用卸载掉。默认值为false
Desired Capabilities android特有键值对介绍:
appPackage:运行的Android应用的包名;如果是测试H5网页则忽略该属性
appActivity:Activity的名字是指从你的包中所要启动的Androidacticity。通常需要再前面添加‘.’;如果是测试H5网页则忽略该属性
unicodeKeyboard:使用Unicode输入法。默认值为false
resetKeyboard:在设定了unicodeKeyboard关键字的Unicode测试结束后,重置输入法到原有状态。如果单独使用,将会被忽略。默认值为false
noSign:跳过检查和对应用进行debug签名的步骤。仅适用于UiAutomator,不适用于selendroid。默认值为false;(一般和app属性一起使用)
DesiredCapabilities使用实例:
- 定义一个Desired Capabilities配置的字典
from appium import webdriver
# 1、定义一个DesiredCapabilities配置的字典
des = {
'automationName':'appium',
'platformName':'Android', # 平台的名称,iOS,Android,FirefoxOS
'platformVersion':'9.1.0', # 填写android虚拟机/真机的系统版本号
'deviceName':'huawei', # 填写安卓虚拟机/真机的设备名称
'appPackage':'com.sky.jisuanji', # 填写被测app包名
'appActivity':'.JisuanjizixieActivity', # 填写被测app的Activity入口
'udid':'HBSBB18821510293', # 填写通过命令行 adb devices 查看到的udid
'noReset':True, # 是否 不重置APP
'noSign':True, # 是否 不签名
'unicodeKeyboard':True, # 是否支持中文输入
'resetKeyboard':True, # 是否支持重置键盘
'newCommandTimeout': 30 # 30秒没发送新命令就断开连接
}
# 2、把配置的字典作为请求参数发送给appium服务器
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des)
- H5网页的Desired Capabilities配置:
from appium import webdriver
# 1、定义一个DesiredCapabilities配置的字典
des = {
'automationName':'appium',
'platformName':'Android', # 平台的名称,iOS,Android,FirefoxOS
'platformVersion':'9.1.0', # 填写android虚拟机/真机的系统版本号
'deviceName':'huawei', # 填写安卓虚拟机/真机的设备名称
'browserName': 'chrome', # 浏览器的设备名称
'udid':'HBSBB18821510293', # 填写通过命令行 adb devices 查看到的udid
'noReset':True, # 是否 不重置APP
'noSign':True, # 是否 不签名
'unicodeKeyboard':True, # 是否支持中文输入
'resetKeyboard':True, # 是否支持重置键盘
'newCommandTimeout': 30 # 30秒没发送新命令就断开连接
}
# 2、把配置的字典作为请求参数发送给appium服务器
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des)
- 点赞
- 收藏
- 关注作者
评论(0)