移动端自动化测试-Appium的Api接口详解及常用adb命令

Appium 初始化配置信息(Desired Capabilities),Desired Capabilities实际上就是一个字典,它主要用于向Appium Server提供初始化配置参数,如:想要测试的系统是Android还是IOS,测试哪款软件,软件的入口是哪里等。

这种服务关键字在网上很多,百度搜一下就有一大堆了。

定位Android的appPackage与appActivity-Windows操作系统方法

通过监控adb操作日志来找到appPackage与appActivity,CMD下输入adb logcat | findstr Start,强制停止被测试软件,再次打开,观察logcat。

 

斜杠之前为appPackage,斜杠之后为appActivity。从此想抓那个App,就抓那个App。(logcat的日志较多,要找点击时第一个Start proc的日志。)

这种查看日志的方式比较不方便,日志一多起来,眼睛一乱什么也找不到了。所以可以使用SDK中的aapt进行抓取

SDK中下载最新的build-tools,通过aapt dump badging xxx.apk命令来查appPackage与appActivity。

包名:

入口:

 下列代码可以打开手机QQ:

复制代码
from appium import webdriver

des = {
'resetKeyboard': True,
'platformVersion': '6.0.1',
'noReset': True, # 不将app初始化
'appActivity': 'com.tencent.mobileqq.activity.SplashActivity',
# 'appActivity': '.BrowserActivity',
'appPackage': 'com.tencent.mobileqq',
# 'appPackage': 'com.android.browser',
'unicodeKeyboard': True,
'deviceName': '1afd95f92',
'platformName': 'Android'}
# print(des)
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)

复制代码

获取APP信息

获取当前界面元素: adb shell dumpsys activity top  (推荐)

获取任务列表:adb shell dumpsys activity activities

app入口(获取数据):

adb logcat | grep -i displayed  (推荐)

Mac/Linux: adb logcat |grep -i activitymanager

Windows: adb logcat |findstr /i activitymanager

aapt dump badging QQ.apk | grep launchable-activity

apkanalyzer最新版本的SDK中才有

启动应用:

adb shell am start -W -n  com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity -S 

获取当前手机APP列表:

adb shell pm list package

清理包缓存数据

adb shell pm clear $package

停止进程

adb shell am force-stop $package

启动APP

adb shell am start -S -W $package/.view.WelcomeActivityAlias

获取当前APP版本信息

adb shell pm dump com.android.browser | findstr version

查看处于当前栈顶的Window和Activity

adb shell dumpsys window | grep mCurrent

获取元素系列

复制代码
# Android对应content-desc IOS对应accessibility identifier
# content-desc是给残障人士定义的特殊字段
driver.find_element_by_accessibility_id('content-desc')

# ID定位于selenium不同,可能存在重复的问题。

appium-desktop抓取元素时如果出现有id,则可以直接用。

resource-id可能出现重复,需要具体看下有多少个。

driver.find_element_by_id('resource-id')

# 对应class字段,有可能存在多个相同class。

多个相同class,每次获取只取第一个遇到的元素。

driver.find_element_by_class_name('class')

# Xpath路径定位,与Web的Xpath定位在有一点点区别

Native App的定位以class为基准,主要用到参数有text、resource-id、index

driver.find_element_by_xpath('//android.widget.EditText[@text="手机号"]')

# 这个在运行时,调用的是Android自带的UI框架UiAutomator的Api

介绍几个简单常用的,text、className、resource-id

text

匹配全部text文字

driver.find_element_by_android_uiautomator('new UiSelector().text("手机号")')
# 包含text文字
driver.find_element_by_android_uiautomator('new UiSelector().textContains("机")')
# 以text什么开始
driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("手")')
# 正则匹配text
driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^手.*")')

# className
driver.find_elements_by_android_uiautomator('new UiSelector().className("android.widget.TextView")')
# classNameMatches
driver.find_elements_by_android_uiautomator('new UiSelector().classNameMatches("^android.widget.*")')

# resource-id、resourceIdMatches
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.syqy.wecash:id/et_content")')

# description
driver.find_element_by_android_uiautomator('new UiSelector().description("S 日历")')
# descriptionStartsWith
driver.find_element_by_android_uiautomator('new UiSelector().descriptionStartsWith("日历")')
# descriptionMatches
driver.find_element_by_android_uiautomator('new UiSelector().descriptionMatches(".*历$")')

# Native App 暂不能使用
driver.find_element_by_tag_name('')

# Native App 暂不能使用
driver.find_element_by_partial_link_text('')

# Native App 暂不能使用
driver.find_element_by_link_text('')

# Native App 暂不能使用
driver.find_element_by_css_selector('')

复制代码

操作APP

复制代码
# 返回是否安装了对应包名的App True 或者 False
driver.is_app_installed('com.syqy.wecash')

# 关闭初始化信息中的App
driver.close_app()

# 启动初始化信息中的App
driver.launch_app()

# 安装app 参数为软件的绝对路径
driver.install_app(r'C:\Users\bjhouyafan\Desktop\tester\appUi\wecash.apk')

# 卸载app 参数接收appPackageName
driver.remove_app('com.syqy.wecash')

# 获取当前打开的app名
driver.current_activity

# 启动某一个包的,某一个入口

参数接受appPackage,appActivity

可以省略多个步骤直接到达指定测试的位置

driver.start_activity('com.android.browser','.BrowserActivity')

# 每隔0.5秒判断一次当前的app名称是否是activityName

WebDriverWait

driver.wait_activity('activityName', 5, 0.5)

# 将启动的app退出到后台,多少秒后在切回app
driver.background_app('m')

# 清除应用数据缓存,相当于卸载重装
driver.reset() 

复制代码

NATIVE_APP 与 WEBVIEW 上下文操作

复制代码
# 返回当前session中的app类型
driver.current_context

# 返回当前app的类型

WEBVIEW 或 WEBVIEW

底层实际调用current_context

driver.context

# 获取app所有的类型

有WEBVIEW的则以list的形式展示两个

driver.contexts

# app类型切换 参数接收app类型

appium对selenium的switch_to的扩展

增加了MobileSwitchTo,继承了selenium的switch_to

driver.switch_to.context('context')

复制代码

KeyCode操作

复制代码
# 隐藏键盘
driver.hide_keyboard()

# 发送按键码,仅按一下,与press_keycode相同

可接收str或int的code码

driver.keyevent(3)

# 发送按键码,仅按一下,可接收str或int的code码
driver.press_keycode(24)

# 发送一个长按的按键码,接收参数必须是int的code码
driver.long_press_keycode(25) 

复制代码

网络

操作输入法

复制代码
# 返回Android上可用的输入法
driver.available_ime_engines

# 返回当前输入法的包名
driver.active_ime_engine

# 是否启动了输入法 True or False
driver.is_ime_active()

# 切换输入法 参数接收available_ime_engines中任意一个输入法包名
driver.activate_ime_engine(driver.available_ime_engines[0])

# 关闭当前输入法
driver.deactivate_ime_engine() 

复制代码

其他

转载至https://www.cnblogs.com/feng0815/p/8481495.html

posted @ 2021-07-17 21:12  R-Bear  阅读(491)  评论(0编辑  收藏  举报