Monkey的使用
adb shell monkey -p com.lqr.wechat -v 500 > monkey.log adb shell monkey -p com.lqr.wechat -vvv 5000 > monkey2.log adb shell monkey -p com.lqr.wechat -vvv 5000 --send=1556166765229 --throttle 500 > monkey3.log adb shell monkey -p com.lqr.wechat -vvv 5000 --send=1556166765229 --ignore-crashes > monkey4.log
参数:android
- -p
- -v
- -s
- --throttle
- --ignore-crashes: 忽略崩溃
- --ignore-timeouts: 忽略ANR
- --ignore-security-exceptions: 忽略证书问题
- --kill-process-after-error: Monkey出错后结束运行
- --monitor-native-crashes: 监控本地崩溃
可经过命令行指定web
- count=5000: 计划执行5000次
- AllowPackage: 包名
- Event percentages: 事件百分比, 可经过命令行修改
- Switch: Activity(页面)跳转
- Sending Touch: 发送动做指令
- Injection Failed #注入(执行)指令失败, App无反应或不支持
- CRASH: 崩溃
指定事件百分比shell
- –pct-touch:触摸事件(点击)
- –pct-motion:动做事件(拖动)
- –pct-trackball:轨迹球事件(移动)
- –pct-nav:基本导航事件:上下左右操做
- –pct-majornav:主导航事件: 确认,菜单,返回键
- –pct-syskeys:系统按键事件: 如HOME键,BACK键,拨号键,挂断键,音量键等
- –pct-appswitch:应用启动事件
- –pct-anyevent: 任意事件
手动中止Monkey浏览器
adb shell ps | grep monkey (查询进程号) kill 进程号
Appium inspector的使用
- 启动和配置
- 定位和操做元素
- 录制
元素定位
- 经过resource_id: find_element_by_id:
- 经过content-desc: find_element_by__accessibility_id
- 经过xpath: 结合属性/上下级节点/索引定位
- 重复元素+索引定位: l = find_elements_by_... l[1].click()
- 逐级定位: driver.find_element_by_id(...).find_element_by_class_name(...)
使用By及元素定位器 from appium.webdriver.common.mobileby import By微信
driver.find_element(By.ID, "....")网络
使用uiautomator的原始定位方式
1.经过id定位app
driver.find_element_by_android_uiautomator('new UiSelector().resourceId(“id”)').click()
- 经过text定位
# Text定位 driver.find_element_by_android_uiautomator('new UiSelector().text("textstr")') # 文字包含 driver.find_element_by_android_uiautomator('new UiSelector().textContains(textStr)') # 以哪一个字符开始 driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith(textStr)')
- 经过class属性定位
driver.find_element_by_android_uiautomator('new UiSelector().className("class属性")')
- 多属性定位
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.TextView").text("Custom View")')
可做为过滤条件的有:ui
- UISelector.text
- UISelector.textContains
- UISelector.textStartsWith
- UiSelector.resourceId
- UISelector.className
- UISelector.textMatches
- UISelector.classNameMatches
- UiSelector.fromParent
- UiSelector.childSelector
- UiSelector.resourceIdMatches
- UiSelector.description
- UiSelector.descriptionStartWith
- UiSelector.descriptionMatches
元素操做
- click()
- send_keys()
- clear()
- is_displayed()/is_enabled()/is_checked()
- get_attribute(): 获取属性 文本/状态/是否可操做等
- get_attribute("text")
- get_attribute("resourceId")
- get_attribute("className")
- set_value(): 设置text值
- text: 元素的文本
- location: 获取元素坐标值
- size: 获取元素大小
练习spa
noReset: True 1. 打开微信应用 ,判断是否存在 登陆按钮 2. 若是已经登陆,登陆按钮不存在 ,就直接进入登陆页,打印 通信录的这些属性值, resourceid,text,className,enabled,clickable,selected,Displayed c = driver.find...() print(c.get_attribute("clickable")) print(c.is_enabled()/c.is_displayed()/c.is_selected()) 若是登陆按钮存在 ,打印这个登陆按钮的上面的属性值resourceid,text,className,enabled,clickable,selected,Displayed, 并点击登陆按钮, 使用set_value())输入用户名密码 判断登陆按钮是否可用, 可用的话打印可用,并点击登陆,判断是否登陆成功 不可用打印不可用 3. 退出应用
练习提示.net
try: # 尝试定位登陆按钮 l = driver.find_element_by_id("") except: # 未定位到 print(“没有登陆按钮”) c = driver.find_....() # 定位 通信录 标签 print(c.get_attribute('resource-id') # 打印各类属性 print(c.text) print(c.get_attribute(“class”) print(c.is_enabled()) .... else: # 若是没有异常(定位到了登陆按钮) print(l.get_attribute("resource-id") # 打印登陆按钮的各类属性 print(l.text) print(l.get_attribute(“class”) print(l.is_enabled()) ... l.click() # 点击登陆按钮 driver.find…().set_value("18010181267") # 使用set_value输入文字 driver.find…().set_value("123456") # 使用set_value输入密码 l2 = driver.find..() # 定位 登陆 按钮 if l2.is_enabled() is True: # 判断 登陆按钮 是否可用 print(“可用”) l2.click() # 点击登陆按钮 try: # 判断是否登陆成功, 登陆成功后会有 "通信录" 这个标签 c = driver.find_....() # 尝试定位通信录这个标签 except: # 定位不到打印失败 print(“登陆失败”) else: # 没有异常(定位到) 打印成功 print(“登陆成功”) else: print("不可用") # 上面的l2登陆按钮不可用打印不可用
按键操做
- drvier.keyevent()
- driver.press_keycode()
练习
启动 微信,登陆用户名和密码,并点击登陆 进入 “我” ,点击用户名, 点击二维码名片, 截图并保存到d:\\screenshot\\VCODE.png 导入截图到手机/sdcard/images/这个路径下 返回到微信聊天列表页,并将音量放大两个分贝 点击菜单回到手机主屏 退出
屏幕操做
- tap: 触控(点击指定坐标),支持多点触控
- swipe: 滑动
- flick: 快滑
- pinch:
- zoom:
- get_screenshot_as_file: 截图
获取屏幕宽度
- width = driver.get_window_size()['width']
- height = driver.get_window_size()['height']
练习
封装四个方法, 向下滑动, 向上滑动, 向左滑动, 向右滑动,
练习2
打开手机设置 滑动查找页面上含有“关于“文字的 元素 若是找到了点击,若是没找到继续找, 进入关于页面,查看手机的版本信息 退出设置页面
文件操做
- driver.pull()
- driver.push()
app操做
autoLaunch=False
- driver.is_app_installed()
- driver.install_app()
- driver.remove_app()
- driver.launch_app()
- driver.start_activity()
- driver.current_activity()
- driver.background_app(3)
- driver.close_app()
网络状态
- driver.network_connection
查找已安装app(无apk包)Package/MainActiviy方法
adb shell logcat | grep cmp=
而后在设备上操做一次app
练习
1.链接appium server,不启动任何app ,(autoLaunch =False) 2.启动微信的首页activity( launch_app() ) 3.打开通知栏,而后关闭通知栏(要先打开一个activity) driver.press_keyevent(“4”) 4.用start_activity()启动本地浏览器,判断当前相机activity是否正确( 获取current_activity 对比当前的activity print driver.current_activity - .Camera) 5. 截屏screenshot.png 并保存到 d:\tmp\目录下 6.把当前app放在后台运行5秒钟 driver.backGround_app—进入 入到app首页 7.查看当前的网络状态,而且输出 8. 判断微信app是否已安装,已安装卸载,未安装执行安装 driver.is_app_install(“com.sankuai.meituan”) Driver.remove_app(“包名”) Driver.install_app(“路径/.apk”)