Python自动化测试---Appium

常用adb命令

获取界面名:adb shell dumpsys window windows | grep mFocusedApp

获取包名+界面名:adb shell dumpsys activity activities

查看已连接系统:adb devices

连接模拟器:adb connect IP:端口号

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)
相关推荐
databook3 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar4 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780514 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_4 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机11 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机12 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机12 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机12 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i12 小时前
drf初步梳理
python·django
每日AI新事件12 小时前
python的异步函数
python