常用adb命令
获取界面名:adb shell dumpsys window windows | grep mFocusedApp
获取包名+界面名:adb shell dumpsys activity activities
查看已连接系统:adb devices
连接模拟器:adb connect IP:端口号
pythondriver_7">python-driver命令
前置代码,基本通用
python">appium_url = 'http://127.0.0.1:4723/wd/hub'#apppium IP+端口号desired_caps = {'platformName':'Android', #系统'platformVersion':'12.0', #系统版本号'deviceName':'Android Emulator',#设备名称'appPackage':'com.dragon.read',#要启动的包名'noReset': True,'appActivity': '.pages.main.MainFragmentActivity', #要启动的界面'unicodeKeyboard':True, #支持中文'resetKeyboard':True #支持中文
}driver = webdriver.Remote(appium_url,desired_caps) #启动
输出当前程序包名和界面名
python">print(driver.current_package) #包名
print(driver.current_activity) #界面名
跳转到某个app界面,(“包名”,“界面名”)
python">driver.start_activity('包名','.界面名')
关闭app
python">driver.close_app() #只是关闭了当前程序,driver对象还在
driver.quit() #直接关闭driver对象,并且关闭所有程序
driver.terminate_app(appPackage)#关闭指定程序app
#判断APP是否安装,如果未安装 则安装,已安装 则卸载
python">if driver.is_app_installed('com.netease.uu'):#判断是否安装的app包名#如已安装,则卸载;driver.remove_app('com.netease.uu')#要卸载app的包名
else:#未安装,则安装:driver.install_app('/Users/username/Downloads/110_774da3cfdcb9c020323ae298da84cda3.apk') #电脑内的安装包路径
回到后台3秒,在返回界面
python">driver.background_app(3)
元素等待
- 显式等待
针对对所有定位元素设置为不同时间值的使用 - 隐式等待
针对对全局所有定位元素设置同一个时间值
python">#显式等待,只针对单个元素,元素被找到也会继续等待,不常用,浪费时间
time.sleep(5)#在等待的20秒时间内,每3秒找一次
WebDriverWait(driver,20,3)#隐式等待,所有定位元素的超时时间设置为同一个,超时报异常通知,
#元素只要找到了就继续往下走 不再等待
driver.implicitly.wait(10)
元素点击
python">driver.find_element_by_id("元素定位").click()
输入框输入
python">driver.find_element_by_id("元素定位").send_keys("输入内容")
输入框清空
python">driver.find_element_by_id("元素定位").clear()#建议可以直接把driver.find_element_by_id("元素定位")赋予变量,直接接收:input_text = driver.find_element_by_id("元素定位")input_text.click()
input_text.send_keys("输入内容")
input_text.clear()
获取元素文本内容
python">input_text = driver.find_element_by_id("元素定位")
print(input_text.text)
获取元素位置和大小
python">input_text = driver.find_element_by_id("元素定位")
print(input_text.location)
print(input_text.size)
获取元素的属性名和属性值
python">login_enable = driver.find_element_by_id("登陆元素定位")
print(login_enable.get_attribute("value")) #value:要获取的元素属性
print(login_enable.get_attribute("text"))
print(login_enable.get_attribute("resourceID"))
print(login_enable.get_attribute("className"))
滑动和拖拽事件
1.1滑动事件(swipe)
从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的移动
参数:
start_x:起点x轴坐标
start_y:起点y轴坐标
end_x:终点x轴坐标
end_y:终点y轴坐标
duration:滑动所持续的长度,单位:ms⬇️
driver.swipe(start_x, start_y, end_x, end_y, duration)
1.2滑动事件(scroll)有惯性
从一个元素滑到另外一个元素,直到页面自动停止
参数:
origin_el:滑动开始的元素
destination_el:滑动结束的元素
⬇️
driver.scroll( origin_el, destination_el )
1.3拖拽事件(drag_and_drop)无惯性
从第一个元素滑动到另一个元素,并且第二元素代替第一个元素原本屏幕上的位置
参数:
origin_el:滑动开始的元素
destination_el:滑动结束的元素
⬇️
driver.drag_and_drop( origin_el, destination_el )
高级手势TouchAction
1.1 手指轻敲
模拟手指对元素或坐标点击后的快速抬起
参数:
element:元素
x:x坐标
y:y坐标
⬇️
TouchAction(driver) . tap(“定位元素”) . perform()
1.2 按下和抬起
模拟手指按下和抬起
参数:
element:元素
x:x坐标
y:y坐标
⬇️
python">#按下
TouchAction(driver) . press("定位元素") . perform()#抬起
TouchAction(driver) . press("定位元素").release().perform()
1.3 等待操作
模拟手指暂停操作
参数:
ms:暂停的毫秒数
⬇️
python">TouchAction(driver).tap("定位元素").wait(2000).release().perfrom()
1.4 长按操作
参数:
element:元素
x:x坐标
y:y坐标
duration:长按时间,单位:ms
⬇️
python">TouchAction(driver).long_press("定位元素",duration=2000).perfrom()
1.5 移动操作
模拟手指移动的操作,比如 手势密码 需要先按下 在移动
参数:
element:元素
x:x坐标
y:y坐标
⬇️
python">#可以move_to很多次,坐标可以通过Automator 放大窗口得到
TouchAction(driver).press("定位元素").move_to("x坐标","y坐标").move_to("x坐标","y坐标").release().perfrom()
手机操作
1.1 获取手机分辨率
需要根据当前设备的分辨率来计算点击和滑动坐标
python">#获取手机分辨率
size = driver.get_window_size()
print(size)
1.2 手机截图
参数:
filename:指定路径下指定格式的图片
⬇️
python">driver.get_creenshot_as_file("screen.png")
1.3 获取设置手机网络
python">#获取手机网络
wifi = driver.network_connection
print (wifi)#设置手机网络
#参数:connectionType:网络类型driver.set_network_connection("输入网络类型")
#connectionType:0,1,2,4,6
#0无网,1飞行模式,2Wi-Fi,4流量,6Wi-Fi+流量
1.4 发送键到设备
模拟返回键或者home键
参数:
keycode:发送给设备的代码
metastate:关于被发送代码的源信息,一般默认
keycode代码可参考: https://blog.csdn.net/Betray391/article/details/142108054
⬇️
python">driver.press_keycode("发送给设备的代码")
1.5 操作手机通知栏
python">#打开手机通知栏
driver.open_notifications()#但并没有关闭通知栏的方法,需要使用滑动方法关闭通知栏
driver.swipe("x坐标","y坐标")#或者使用返回键,进行关闭通知栏
driver.press_keycode(4)