appium
github中基于selenium二次开发的开源app测试框架
appium的原理:
自动化程序通过http发出指令经过appium server(Xcode/android SDK)转发给手机app,之后再返回给appium server,再传给自动化程序,运行过程是appium server启动后会在手机上安装一个代理程序,它是由苹果或者安卓官方写的库(android:uiautomator,ios:xcuiest),当收到我们的指令后调用该库从而实现操作手机,如滑动,触摸,锁屏等
安装
dos连接模拟器
模拟器建议夜游神,雷电,mumu
安装好模拟器后,cmd=>adb devices 连接不成功,可以尝试在sdk/platform-tools/adb.exe文件覆盖模拟器bin目录下adb.exe文件(注意重启浏览器,dos和杀掉adb进程:sudo adb kill-server)
appium安装地址(该appium只是查看定位页面元素用的,如果需要通过代码起appium,因为步骤比较多自行百度)
https://github.com/appium/appium-desktop/releases
python操作appium初始化操作
pip install Appium-Python-Client
from appium import webdriver # appium基于selenium二次开发 #启动app中的软件 desc = { "deviceName": "127.0.0.1:62001", # 手机唯一标示 "platformName": "Android", # 手机类型 "platformVersion": "4.4.2", # 手机版本 "appPackage": "com.android.settings", # 软件包名
"noReset":True # 不格式化app软件(可用于不初始化cookie等其他信息) #抓取软件包名的三种方式: #1.问相关开发者 #2.抓取logcat日志文件,保证抓取软件是冷启动状态 # mac 终端输入 adb logcat | grep START #windows dos输入 adb logcat|findstr START #以手机打开设置为例,查看 cmp=com.android.settings/.SubSettings样式,注意=和/中间的才是包名(com.android.settings) #app冷启动:后台没有进程;app热启动:后台可以查看到这个程序的进程;通常在做测试的时候要保证程序是冷启动状态,让其重新打开程序 #3.aapt命令 查看软件包信息
#进入sdk下有aapt目录中
# mac终端输入: ./aapt dump badging 软件包akp绝对路径
# windows在doc输入: aapt dump badging 软件包akp绝对路径
#查看包名:package:name='xxx',查看口入:launchable-activity:xxxx
"appActivity": ".SubSettings", # 软件入口,方式2中前面包名/后面的就是入口了
#4 adb shell pm list package 直接输入该命令找到你所需要的包即可
} driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desc) #desc相当于初始化的参数 # remote默认调用command_executor='http://127.0.0.1:4444/wd/hub # 参数一通过ip连接服务地址,默认端口是4723,参数二:连接服务的参数
定位方式
from appium import webdriver driver = webdriver.Remote('http://127.0.0.1:4444/wd/hub') #定位方式基本与selenium一致,下面介绍一些特殊的定位方式 driver.find_element_by_accessibility_id('xxxx').send_keys('1111')#针对残障人士所定义的id,输入对应content-desc的属性值 #Android特有定位方式 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("^内.*")')#以正则来匹配text文字 driver.find_elements_by_android_uiautomator('new UiSelector().className("android.widget.TextView")')#按classname匹配 driver.find_elements_by_android_uiautomator('new UiSelector().classNameMatches("^android.widget.*")')#以正则匹配classname driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.syqy.wecash:id/et_content")')#以resourceId匹配 driver.find_element_by_android_uiautomator('new UiSelector().description("S 日历")')#日历 driver.find_element_by_android_uiautomator('new UiSelector().descriptionStartsWith("日历")')#descriptionStartsWith日历 driver.find_element_by_android_uiautomator('new UiSelector().descriptionMatches(".*历$")')#以正则匹配日历
滚动
driver.scroll(elementObj1, elementObj2)#滚动处理:elementObj1目标滚动元素,elementObj2起始滚动元素
拖拽
driver.drag_and_drop(elementObj1,elementObj2)#拖拽处理,elementObj1为源元素,elementObj2为目标元素
滑屏
#通过当前屏幕分辨率获取坐标来指定上下左右滑动做出任何手机公有的模块 #所有ui自动化根据屏幕左上角向下为高,向右为宽 size = driver.get_window_size() width = size.get('width') height = size.get('height') x1 = width *0.5 x2 = width *0.5 y1 = height *0.8 y2 = height*0.2 driver.swipe(x1,y1,x2,y2)#向上滑,页面向下移动
针对app的api操作
print(driver.is_app_installed('xxx'))#判断当前指定包名是否被安装,返回布尔值 driver.remove_app('xxx')#卸载安装包 driver.install_app('xxx')#安装安装包 driver.close_app()#关闭当前初始化app driver.launch_app()#启动初始化app driver.start_activity('包名','入口')#启动多个app,之前的是初始化的app这是后启动的app driver.background_app(5)#将启动的app退回到页面,过5秒后再次启动 driver.reset()#调用直接初始化 driver.press_keycode(66)#操作手机按键码,66表示回车,其他请百度
上下文
#h5切换 手机浏览器操作进入h5页面也称为进入webview页面,要求必须让开发者将webview的debug模式打开 #如果进入手机页面,当前指针进入的是手机原生app,需要切换进入webview print(driver.contexts)#获取当前所有页面的上下文位置 driver.switch_to.context('WEBVIEW_com.android.browser')#切换进入指定页面位置
操作输入法
print(driver.available_ime_engines)#返回Android可用的输入法 print(driver.active_ime_engine)#返回输入法的包名 print(driver.is_ime_active())#判断是否启动输入法,返回布尔值 driver.activate_ime_engine(driver.available_ime_engines[0])#切换输入法 driver.deactivate_ime_engine()#关闭当前的输入法
keycode操作
#keycode操作 driver.hide_keyboard()#隐藏小键盘 driver.keyevent(3)#发送按键码,可接收str或int的code码 driver.press_keycode(24)#发送按键码,可接受str或int的code码 driver.long_press_keycode(25)#发送一个长按的按键码,接收参数必须是int的code码
网络状态
print(driver.network_connection)#返回当前手机的网络状态 # 导入 from appium.webdriver.connectiontype import ConnectionType ConnectionType.WIFI_ONLY# WIFI ConnectionType.DATA_ONLY# 数据流量 ConnectionType.AIRPLANE_MODE#飞行模式 ConnectionType.NO_CONNECTION#无网络模式 ConnectionType.ALL_NETWORK_ON#全部都打开 driver.set_network_connection(ConnectionType.AIRPLANE_MODE)# 设置 网络
其他
driver.lock()# 锁定手机多少秒 仅IOS driver.shake()# 摇手机 driver.open_notifications()# 打开通知栏 仅Android driver.device_time# 获取连接手机的当前时间 driver.toggle_location_services()# 开启或关闭手机定位服务
appium-deskoy
是一个便携型appium简单封装了appium服务功能,主要功能可以本地机或者远程机进行定位元素
开启服务后,添加一个新的session window
安装如下填写,platformName(填被测手机是安卓还是ios) deviceName(自定义名字) platformVersion(被测手机版本) appPackage(app包名,上面有讲怎么抓) appActivity(启动入口,上面有讲怎么抓) ,之后点击start session
参考 https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md
{
"platformName": "Android",
"deviceName": "rainbol",
"platformVersion": "6.0.1",
"appPackage": "com.xxx.sxxxx",
"appActivity": ".xxxx"
}
app中定位元素
1.appium deskory(上图的工具)
automatic server 获取本地的元素 -> 可以填写参数信息或者json字符串,可保持参数saved capability sets,启动相应配置的参数start session
点击start session后进入定位元素页面(下面按键依次介绍)
a.对当前页面进行元素定位,类似浏览器f12的页面抓取元素
b.显示坐标并且操作屏幕滑动
c.没什么用
d.后退
f.刷新,如果和手机页面不一致可以刷新重置
g.录制-appium的灵魂所在,关键还可以把录制内容变成可执行的语言文件,支持pyton,java各种语言
h.特殊定位属性,类似于狐火的filebug-xpath
Selected Element
Find By
表示该定位的元素只能通过以下属性定位
Attribute(属性)
resource-id
类似于html中的id,但是可能重复出现多个,如果在Find By中显示通过id定位,那不用考虑resource-id是否重复
clickable
是否允许被点击,返回布尔值
class
与html中class一致,同时在这儿理解为标签
text
文本属性
2.ui automator viewer
sdk中tools目录下轻量级定位元素工具(其会和appium-destory冲突)
appium元素定位:
版权声明:本文原创发表于 博客园,作者为 RainBol 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。