目录
adb调试工具(Android Debug Bridge)
adb常用命令
Appium使用
快速体验步骤
Appium常用方法
UIAutomatorViewer 获取元素
元素等待(在指定时间内一直等待
元素操作
Swipe 滑动和拖拽事件(Scroll、drag_and_drop)
手势操作TouchAction
手机操作API(分辨率、按钮、截图、网络、通知栏)
网络补充:
0. 环境基础
- Java(jdk 1.8)
- Android SDK(adb)
- Android模拟器(Genymotion、VirtualBox)
adb调试工具(Android Debug Bridge)
adb包含三个部分:
- Client端:运行在开发电脑上,负责发送adb命令
- Daemon守护进程:运行在手机(或模拟器),负责接收和执行adb命令
- Server端:运行在开发电脑上,负责管理Client端和手机Daemon之间的通信
adb工作原理:
- Client端将命令发送给Server端
- Server端将命令发送给Daemon端
- Daemon端执行
- Daemon端将执行结果,返回给Server端
- Server端将结果再返回给Client端
adb常用命令
获取当前包名和界面名(告诉手机测试哪个应用程序的哪个一个界面)
- 包名(package):一个应用程序的唯一ID
- 界面名(activity):一个界面名对应一个界面
adb shell dumpsys window | grep mFocusedApp
返回结果中,“/” 前的为包名,“/” 后的为界面名
文件传输
从电脑发送文件到手机: adb push 电脑文件路径 手机的文件夹路径
从手机中拉取文件:adb pull 手机文件路径 电脑的文件夹路径
获取app启动时间
adb shell am start -w 包名/启动名
- ThisTime:该界面(activity)启动耗时(毫秒)
- TotalTime:应用自身启动耗时 = ThisTime + 应用application等资源启动时间(毫秒)
- WaitTime:系统启动应用耗时 = TotalTime + 系统资源启动时间(毫秒)
点击图标 -> 系统资源调度 -> application程序启动 -> activity界面加载 -> 界面展示完成
获取手机日志
adb logcat
找日志中at……前面 第一个字符为 "E" 的均为错误信息
- 安装app到手机 adb install 路径/xx.apk
- 卸载手机上的app adb uninstall 包名
- 获取当前电脑已经连接的设备 adb devices
- 进入到安卓手机内部的Linux adb shell exit退出Linux
# 重启adb服务
- 启动adb服务器 adb start-server
- 停止adb服务器 adb kill-server
- 查看adb帮助 adb --help
Appium使用
- 通过官网下载Appium: Mobile App Automation Made Awesome.
- 若失败,通过nodejs下载npm 这个链接
- pip3 install appium-python-client
- 若失败,参考这个博客。 pip3 install --upgrade pip --user
快速体验步骤
- 打开手机模拟器(Genymotion)
- 打开appium.app工具
- 创建Python项目 from appium import webdriver
from appium import webdriver
import time
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '10'
# 设备名,按默认,主要用于限制iOS
desired_caps['deviceName'] = '192.168.56.101:5555'
# 包名
desired_caps['appPackage'] = 'com.android.settings'
# 界面名
desired_caps['appActivity'] = '.Settings'
# 解决中文输入问题
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(5)
driver.quit()
原理:
- appium实际上在本机上使用4723端口开启了一个服务
- Python代码通过访问本机的服务器,获取driver对象
- appium将我们的driver对象调用的方法转化成POST请求,提交给appium服务器
- appium通过接收到的POST请求发送给手机,再由手机进行执行
Appium常用方法
# 打开指定包指定界面
driver.start_activity(“appPackage包名”, “appActivity界面名”)
# 获取包名
driver.current_package
# 获取界面名
driver.current_activity
# ——————关——————闭——————
# 关闭当前app,不关闭驱动对象
driver.close_app()
# 关闭驱动对象,同时关闭所有关联的app
driver.quit()
# ——————安装卸载及是否安装——————
# 安装app
driver.install_app("app_path apk安装包路径")
# 卸载app
driver.remove_app("app_id 包名")
# 判断app是否已经安装
driver.is_app_installed("app_id 包名")
# ——————将应用置于后台——————
driver.background_app(seconds 秒数)
UIAutomatorViewer 获取元素
启动该程序使用Device Screenshot工具获取元素特征信息
# 通过id定位(resource id)
driver.find_element_by_id("id-value").click() #并点击
# 通过class_name定位
driver.find_element_by_class_name("class-value").send_keys("hello") #并输入hello
# 通过xpath定位 # 包含则使用://*[contains(@变量名,'xx')]
driver.find_element_by_xpath("xpath-value表达式://*[@变量名='xx']")
# 定位一组元素 by_id / by_class_name / by_xpath
driver.find_elements_by_id("xxxx")
元素等待(在指定时间内一直等待
# 隐式等待(秒),全局有效
driver.implicitly_wait(20)
# 显式等待,对单个元素有效
from selenium.webdriver.support.wait import WebDriverWait
wait = WebDriverWait(driver, 5)
# 仅对修饰元素有效
back_button = wait.until(lambda x: x.find_element_by_xpath("xxxx"))
back_button.click()
元素操作
element.click()
element.send_keys("xxx")
# 清空输入框内容
element.clear()
# 获取元素内容
element.text
element.location
element.size
# 获取元素属性 如:name(content-desc / text)、resourceId、className、enabled、clickable")
element.get_arribute("属性名")
Swipe 滑动和拖拽事件(Scroll、drag_and_drop)
# Swipe 从一个坐标滑动到另一个坐标,duration 滑动持续时间长短,单位:ms
driver.swipe(start_x, start_y, end_x, end_y, duration=None)
# scroll 从一个元素滑动到另一个元素,直到页面惯性结束自动停止
button1 = driver.find_element_by_id("xxx")
button2 = driver.find_element_by_id("xxxx")
driver.scroll(button1, button2)
# drag_and_drop 从一个元素滑动到另一个,第二个元素代替第一个元素的位置
driver.drag_and_drop(button1, button2)
手势操作TouchAction
# 创建TouchAction对象
touch_action = TouchAction(driver)
# 轻敲
touch_action = touch_action.tap(element=元素, x=xxx, y=xxx, count=次数)
# 执行
touch.perform()
- 创建TouchAction对象
- 通过对象调用执行手势
- perform() 执行动作
轻点tap、按下press、抬起release、等待wait、长按long_press、移动move_to
# 轻敲 tap(element,x,y,count)
TouchAction(driver).tap(element=元素, x=xxx, y=xxx, count=次数).perform()
# 按下和抬起 press、release
TouchAction(driver).press(x=xxx, y=xxx).release().press()..release().perform()
# 等待 wait (单位:ms)
TouchAction(driver).press(x=xxx, y=xxx).wait(2000).release().perform()
# 长按 long_press
TouchAction(driver).long_press(element, x=坐标, y=坐标, duration=持续时间).perform()
# 移动 move_to
TouchAction(driver).press(x=坐标, y=坐标).move_to(x=坐标, y=坐标).release().perform()
手机操作API(分辨率、按钮、截图、网络、通知栏)
Android KeyCode:Android KeyCode列表_51CTO博客_event.keycode
# 获取手机分辨率
driver.get_window_size()
# 截图
driver.get_screenshot_as_file("path.filename")
# 获取网络
print(driver.network_connection)
# 设置网络
driver.set_network_connection(数字0-6)
# 发送键到设备 Android Keycode
driver.press_keycode("keycode", metastate=None)
# 打开通知栏
driver.open_notifications()
# 返回键
driver.press_keycode(4)
网络补充:
from appium.webdriver.connectiontype import ConnectionType
class ConnectionType: NO_CONNECTION = 0 AIRPLANE_MODE = 1 WIFI_ONLY = 2 DATA_ONLY = 4 ALL_NETWORK_ON = 6