目录
前言:
本文为在霍格沃兹测试开发学社中学习到的一些技术写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 😘
- Appium Desired Capabilities官方文档:http://appium.io/docs/en/writing-running-appium/caps/index.html
- appium-uiautomator2-drive Capabilities官方文档: https://github.com/appium/appium-uiautomator2-driver#capabilities
1. Capability 介绍
1.1 Capability 功能
Capability 主要用于配置 Appium会话,告诉 Appium 服务器需要自动化的平台的应用程序。Capability在使用编写测试脚本时会向Appium服务器端发送指令,让Appium服务器端知道被测设备的信息,Capability也可在去设置Appium运行过程中的参数,通过设置参数可以提高运行的速度,或者是满足特殊场景。
1.2 Capability形式
Capability是键值对的集合,键对应设置的名称,值对应设置的值。
{
"platformName": "android",
"deviceName": "emulator-5554",
"appPackage": "io.appium.android.apis",
"appActivity": ".ApiDemos"
}
2. Capability参数
2.1 公共部分参数配置
键 | 描述 | 值 |
---|---|---|
platformName | 使用的手机操作系统 | iOS,Android,或者 Firefox0S |
platformVersion | 手机操作系统的版本 | 例如7.1 ,4.4 |
deviceName | 使用的手机或模拟器类型 | iPhone Simulator ,iPad Simulator ,iPhone Retina 4-inch ,Android Emulator ,Galaxy S4 , 等等…. 在 iOS 上,使用 Instruments的 instruments -s devices 或者 xcrun xctrace list devices (Xcode版本>12) 命令可返回一个有效的设备的列表。在 Andorid 上虽然这个参数目前已被忽略,但仍然需要添加上该参数,可随便设置 |
automationName | 使用哪个自动化引擎 | android 默认使用uiautomator2 ,ios 默认使用XCUTest |
noReset | 在当前 session 下不会重置应用的状态。默认值为false | true ,false |
udid | 连接的真实设备的唯一设备编号 (Unique device identifier) | 例如1ae203187fc012g |
2.2 Android 部分特有参数配置
键 | 描述 | 值 |
---|---|---|
appActivity | Activity 的名字是指从你的包中所要启动的 Android acticity。他通常需要再前面添加. (例如 使用.MainActivity 代替MainActivity ) | MainActivity ,.Settings |
appPackage | 运行的 Android 应用的包名 | com.example.android.myApp ,com.android.settings |
appWaitActivity | 用于等待启动的 Android Activity 名称 | SplashActivity |
unicodeKeyboard | 启用 Unicode 输入,默认为 false | true orfalse |
resetKeyboard | true orfalse | |
dontStopAppOnReset | 首次启动的时候,不停止 app | true orfalse |
skipDeviceInitialization | 跳过安装,权限设置等操作 | true orfalse |
2.3 iOS 独有参数配置
键 | 描述 | 值 |
---|---|---|
bundleId | 被测应用的 bundle ID 。用于在真实设备中启动测试,也用于使用其他需要 bundle ID 的关键字启动测试。在使用 bundle ID 在真实设备上执行测试时,你可以不提供app 关键字,但你必须提供udid 。 | 例如io.appium.TestApp |
autoAcceptAlerts | 当 iOS 的个人信息访问警告 (如 位置、联系人、图片) 出现时,自动选择接受( Accept )。默认值 false | true 或者 false |
showIOSLog | 是否在 appium 日志中显示从设备捕获的任何日志。默认 false | true or false |
2.4 测试策略相关设置
键 | 描述 | 值 |
---|---|---|
newCommandTimeout | newCommandTimeout是appium等待下一次命令发送过来的时长。如果在这个时间范围内,还未收到下一次的命令,就会报超时异常。默认是60秒,可以根据需求设置对应时间。比如,测试过程中存在上传apk文件的这种操作,该操作耗时可能会比较长,若果不从新设置超时时间,可能在60s内无法完成上传操作,导致测试流程中断。 | e.g. 60 |
udid | 1. udid是满足Appium允许多设备同时运行的参数,当存在多设备的时候,appium只会读取设备列表中的第一个设备进行运行。如果只设置devicename,是不能指定设备的唯一标识的,必须通过udid来确定设备,uidi是确定设备的唯一标识。 2. Android 系统中可以使用 adb devices -l 来获取设备列表,从而取得udid。3. iOS系统的话,设备的udid需要去xcode中查找,xocode中有一个设备管理的位置,可以用于查看设备信息。 | e.g. 1ae203187fc012g |
autoGrantPermissions | 1. autoGrantPermissions是设置appium自动授予的权限的参数。比如,在设备首次安装app是会弹出需要授予系统权限的弹框,这种弹框的弹出可能会影响测试过程,但是如果所有的权限弹框操作都全部通过脚本去处理就会非常麻烦。因此可以使用autoGrantPermissions去自动授予权限,关闭权限弹框。 2. 注意:当noReset参数是True的话,autoGrantPermissions则无法生效。 | true or false |
noReset | Android: noReset的作用是停止APP、 不清除APP数据、 不卸载app | true ,false |
fullReset | Android:停止APP、 清除APP数据 或卸载app停止APP、 清除APP数据 或卸载app | true ,false |
dontStopAppOnReset | 如果配置的APP是当前已经启动的APP的话,则不会kill掉当前页面,再重新启动的。(参数很有用,尤其在自动化测试过程中需要衔接上调case和下调case的使用) | true or false |
2.5 性能相关参数设置
键 | 描述 | 值 |
---|---|---|
skipDeviceInitialization | 如果设置为true,则在会话创建时取消设备启动检查(主要检查设备是否准备好,设置应用程序是否已安装等)。默认为False 。 | true ,false |
skipServerInstallation | 如果设置为true,则跳过在被测设备上的UiAutomator2 Server组件安装和所有相关检查。如果您确定设备上安装了正确的服务器版本,这将有助于加快会话启动。如果没有安装服务器或安装了不正确的版本,那么稍后可能会出现意外错误。默认为False | true ,false |
skipUnlock | 当设置成true 时会跳过检查锁屏是否存在的操作。默认情况下,UiAutomator2驱动程序尝试在开始测试之前检测设备的屏幕是否被锁定并解锁(有时可能不稳定)。注意,此操作需要一些时间,因此强烈建议将此功能设置为true,并在测试设备上禁用屏幕锁定。 | true or false |
skipLogcatCapture | 设置为true将禁止在测试运行期间自动收集logcat输出。默认为False | true or false |
systemPort | UiAutomator2服务器监听的端口号。默认情况下,选择8200…8299范围内的第一个空闲端口。如果在同一台计算机上运行并行测试,建议设置此值。 | |
ignoreUnimportantViews | 启用或禁用布局层次结构压缩。如果启用压缩,框架中将只包含对uiautomator测试比较重要的节点。其他不必要的节点会被删除,默认为True。 | true or false |
3. 示例
在setup中创建一个 desire_cap字典,用来存放Capability相关配置
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
class TestXueQiu:
def setup(self):
# 创建一个字典
desire_cap = {}
# 平台
desire_cap['platform'] = 'Android'
#手机系统版本
desire_cap['platformVersion']= '6.0'
# 设备名
desire_cap['deviceName'] = '127.0.0.1:7555'
# app 包名
desire_cap['appPackage'] = 'com.xueqiu.android'
# app 页面名
desire_cap['appActivity'] = '.common.MainActivity'
desire_cap['noReset'] = 'true'
#每次测试重置数据
desire_cap['skipDeviceInitization']= 'true'
#保证可以正常输入中文
desire_cap['unicodeKeyBoard'] = 'true'
desire_cap['resetKeyBoard'] = 'true'
self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desire_cap)
self.driver.implicitly_wait(10)
def teardown(self):
# 回收session
self.driver.quit()
def test_api_demo(self):
"""
1、打开 雪球 app
2、点击搜索输入框
3、像搜索框中输入“阿里巴巴”
4、在搜索结果中选择“阿里巴巴”,然后进行点击
5、获取这只上 阿里巴巴的股价,并判断这只股价的价格<200
6、断言
:return:
"""
#定位搜索框并进行点击
self.driver.find_element(AppiumBy.ID,'com.xueqiu.android:id/tv_search').click()
#搜索框输入“阿里巴巴”
self.driver.find_element(AppiumBy.ID,'com.xueqiu.android:id/search_input_text').send_keys("阿里巴巴")
#在搜索结果中选择“阿里巴巴”,并且点击
self.driver.find_element(AppiumBy.XPATH,"//*[@resource-id='com.xueqiu.android:id/name' and @text='阿里巴巴']").click()
#获取当前股价
current_price=float(self.driver.find_element(AppiumBy.ID,'com.xueqiu.android:id/current_price').text)
# 断言
assert current_price<200
文末说明:
接口测试中我们很容易混淆Session、cookie和token,你知道他们有什么区别吗?快来跟我一起看,一篇文章让你了解三者的区别。😎
⬇⬇⬇⬇⬇⬇⬇
👍👍👍:接口测试经典面试题:Session、cookie、token有什么区别?