adb构成
- client端,在电脑上,负责发送adb命令
- daemon守护进程,在手机上,负责接收和执行adb命令
- server端,在电脑上,负责管理client和daemon之间的通信
adb工作原理
- client端将命令发送给server端
- server端将命令发送给daemon端
- daemon端进行执行
- 将执行结果返回给server端
- server端将结果再返回给client端
ADB获取包名和界面名
包名:对应着应用程序
界面名也叫启动名:对应着应用程序的某个界面
应用场景:后期告诉计算机打开哪个应用程序和那个界面
mac
adb shell dumpsys window windows | grep mFocusedApp
window
adb shell dumpsys window windows | findstr mFocusedApp
文件传输
发送文件到手机
adb push 电脑文件路径 手机的文件夹路径通常是sdcard
从手机中拉取文件
adb pull 手机文件路径 电脑的文件夹路径
获取app启动时间
adb shell am start -w 包名/启动名
ThisTime:该界面启动耗时ms
TotalTime:应用自身启动耗时=ThisTime+应用程序等资源启动时间ms
WaitTime: 系统启动应用耗时=TotalTime+系统资源启动时间
获取手机日志
adb logcat
其他adb命令
Appium框架
如何通过代码跳转其他的app
通过driver对象
driver.start_activity(appPackage,appActivity);//包名、界面名
获取app包名和界面名
print(driver.current_package)、print(driver.current_activity)
关闭app和驱动对象
driver.close_app():关闭应用程序,但driver对象还存在
driver.quit():关闭驱动对象,同时关闭所有关联的app
安装卸载app以及是否安装app
driver.install_app(path路径)
driver.remove_app(包名)
driver.is_app_installed(包名)
将应用置于后台
driver.background_app(seconds)后台停留几秒
热启动:表示进入后台回到前台
冷启动:关机在开这种切断电源的行为
UIAutomatorViewer
定位一个元素
driver.find_element_by_id("")
send_keys("")输入
click()点击
driver.find_element_by_class_name("")
driver.find_element_by_xpath("//*[@]")
定位一组元素
driver.find_elements_by_id("")
driver.find_elements_by_class_name("")
driver.find_elements_by_xpath("//*[@]")
包含需要使用contains函数
注意点: driver.find_element_by_id("")传入一个不存在的id,会出现NoSuchElementException错误,而 driver.find_elements_by_id("")不会报错,会返回一个空的列表
元素等待
应用场景
- 网络速度原因
- 服务器请求处理原因
- 电脑配置原因
显式等待(单个元素)
WebDriverWait(driver,timeout,频率)
wait=WebDriverWait(driver,5,1):总共5s查找元素,每1s调用一次
wait.until(method)
如果找到,则继续后面的操作
如果没有找到,则会报错TimeOutException
隐式等待(全局)
driver.implictly_wait(10)设置超时时间
设置超时时间后,所有找元素方法都会在10s内等待元素的出现
如果出现,则继续后面的操作
如果没有出现,就会报错NoSuchElementException
点击/输入/清空
element.click()点击
element.send_keys()输入
element.clear()清空
输入中文需要以下两行代码
desired_caps['unicodeKeyboard']=True
desired_caps['resetKeyboard']=True
文本内容/位置/大小
文本内容:text属性
元素位置:location属性,它是一个字典,字典中有x和y两个key,dict["x"],取得数据类型为int类型
元素大小:size属性,它是一个字典,字典中有width和height两个可以,dict["width"],取得数据类型为int类型
根据属性名获取属性值
elems.get_attribute("value"); //这里value代表属性名,不要被误导了,对应返回就是属性值
特殊注意
想获取resource-id,传参进去使用resourceId,API>=18
想获取class,传参进去使用className,API>=18
想获取content-desc,传参进去使用name
滑动拖拽事件
swipe
driver.swipe(起始x坐标,起始y坐标,结束x坐标,结束y坐标,持续时间ms)
特点:参数是坐标点,如果持续时间短,惯性就大
scroll和drap_and_drop
driver.scroll(起始元素,结束元素):参数是元素。没有持续时间,惯性很大
driver.drap_and_drop(起始元素,结束元素):参数是元素。没有持续时间,没有惯性
高级手势TouchAction
使用步骤
- 创建TouchAction对象
- 通过对象调用想执行的任务
- 通过perform()执行动作
手指轻敲操作
TouchAction(driver).tap(element,x,y,count).perform();
tap()里面传参:要么只传元素按钮,要么只传坐标x=650,y=650,count代表点击次数,多次点击
按下抬起操作
按下press松开release
TouchAction(driver).press(element,x,y).release().perform();
press()里面传参:要么只传元素按钮,要么只传坐标x=650,y=650
等待
wait()方法
TouchAction(driver).press(element,x,y).wait().release().perform();
长按
TouchAction(driver).long_press(el,x,y,duration).perform();
TouchAction(driver).press(element,x,y).wait().release().perform();
long_press()里面传参:要么只传元素按钮,要么只传坐标x=650,y=650
长按相当于按下+等待+抬起
移动
图案实例
move_to(el,x,y)方法
TouchAction(driver). press(x=244,y=856).move_to(x=721,y=843).perform();
手机操作API
分辨率和截图
获取手机分辨率
driver.get_window_size()
截图
driver.get_screenshot_as_file("路径/文件名")
获取和设置手机网络
获取手机网络
driver.network_connection属性
print(driver.network_connection)
流量data
设置网络类型
driver.set_network_connection(ConnectionType.DATA_ONLY)
发送键到设备
网站:https://blog.csdn.net/feizhixuan46789/article/details/16801429
driver.press_keycode(keycode,metastate=None)
操作通知栏
打开手机通知栏
driver.open_notifications()
返回通知栏
driver.press_keycode(4)