枕上从妨一夜睡,灯前读尽十年诗。这篇文章主要讲述移动端自动化测试 -- appium 之Desired Capabilities与 定位控件相关的知识,希望能为你提供帮助。
一、Desired Capabilities
Desired Capabilities 在启动 session 的时候是必须提供的。
Desired Capabilities 本质上是以 key value 字典的方式存放,客户端将这些键值对发给服务端,告诉服务端我们想要怎么测试。它告诉 appium Server这样一些事情:
- 本次测试是启动浏览器还是启动移动设备。
- 是启动Andorid还是启动ios。
- 启动android时,app的package是什么。
- 启动Android时,app的activity是什么。
- …
desired_caps = {}
desired_caps[‘platformName‘] = ‘Android‘
desired_caps[‘platformVersion‘] = ‘4.4.2‘
desired_caps[‘deviceName‘] = ‘127.0.0.1:62001‘
desired_caps[‘appPackage‘] = ‘com.tencent.mobileqq‘
desired_caps[‘appActivity‘] = ‘com.tencent.mobileqq.activity.SplashActivity‘# android 独有
desired_caps["unicodeKeyboard"] = "True"
desired_caps["resetKeyboard"] = "True"
desired_caps["noReset"] = "True"
driver = webdriver.Remote(‘http://127.0.0.1:4723/wd/hub‘, desired_caps)
- deviceName:启动哪种设备,是真机还是模拟器?iPhone Simulator,iPad Simulator,iPhone Retina 4-inch,Android Emulator,Galaxy S4…
- automationName:使用哪种自动化引擎。appium(默认)还是Selendroid。
- platformName:使用哪种移动平台。iOS,
Android, orFirefoxOS。
- platformVersion:指定平台的系统版本。例如指的Android平台,版本为5.1。
- appActivity:待测试的app的Activity名字。比如MainActivity、.Settings。注意,原生app的话要在activity前加个”.“。
- appPackage:待测试的app的java package。比如com.example.android.myApp, com.android.settings。
- noReset:Don‘t reset app state before this session
- resetKeyboard:Reset keyboard to its original state, after running Unicode tests with
unicodeKeyboard
capability. Ignored if used alone. Defaultfalse
- unicodeKeyboard:Enable Unicode input, default
false
-
/127.0.0.1:4723 : appium-server 地址
知识拓展:定位appPackage与appActivity 方法
SDK中下载最新的build-tools,通过aapt dump badging xxx.apk命令来查appPackage与appActivity。
CMD下输入adb logcat | findstr /i Start,强制停止被测试软件,再次打开,观察logcat。(手动打开需要操作的appPackage ,从logcat 最下面开始找)
二、定位控件
appium 通过 uiautomatorviewer.bat 工具来查看控件的属性。该工具位于 Android SDK 的 /tools/bin/ 目录下。
1、id 定位
driver.find_element_by_id(‘resource-id‘)
# ID定位于selenium不同,可能存在重复的问题。
【移动端自动化测试 -- appium 之Desired Capabilities与 定位控件】# appium-desktop抓取元素时如果出现有id,则可以直接用。
# resource-id可能出现重复,需要具体看下有多少个。 2、class name 定位 driver.find_element_by_class_name(‘class‘) # 对应class字段,有可能存在多个相同class。 # 多个相同class,每次获取只取第一个遇到的元素。 3、xpath 定位 driver.find_element_by_xpath(‘//android.widget.EditText[@text="手机号"]‘) # Xpath路径定位,与Web的Xpath定位在有一点点区别 # Native App的定位以class为基准,主要用到参数有text、resource-id、index 4、Accessibility ID定位 --这个方法属于Appium扩展的定位方法 driver.find_element_by_accessibility_id(‘content-desc‘) # Android对应content-desc IOS对应accessibility identifier # content-desc是给残障人士定义的特殊字段 5、android uiautomator定位 --这个方法属于Appium扩展的定位方法 Android的源生测试框架的定位方式,定位速度快 driver.find_element_by_android_uiautomator(‘new UiSelector().text("手机号")‘) # 匹配全部text文字 driver.find_elements_by_android_uiautomator(‘new UiSelector().className("android.widget.TextView")‘) # className 6、iOSPredicateString 仅支持iOS10以上,可以多个属性同时定位,推荐。(替代XPATH) driver.find_elements_by_ios_predicate("label == ‘登录‘")
推荐阅读
- Android GridLayoutManager 某些item 独站一行
- android 开发常见问题
- Android 四大组件BroadcastReceiver 介绍
- Android recyclerview 只显示一行 宽度不适配
- Android视图动画集合AndoridViewAnimations
- Parallax Mapping
- Android App卡顿慢优化之解决内存抖动及内存泄漏
- Springboot使用JdbcTemplate RowMapper查询,直接返回实体列表
- XamarinAndroid组件教程RecylerView动画组件使用动画