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)
相关推荐
西猫雷婶9 分钟前
python学opencv|读取图像(十六)修改HSV图像HSV值
开发语言·python·opencv
lovelin+v1750304096620 分钟前
智能电商:API接口如何驱动自动化与智能化转型
大数据·人工智能·爬虫·python
weixin_5375904521 分钟前
《Java编程入门官方教程》第八章练习答案
java·开发语言·servlet
lsx20240625 分钟前
MVC 发布
开发语言
赵谨言30 分钟前
基于python+django的外卖点餐系统
经验分享·python·毕业设计
孤独的履行者38 分钟前
入门靶机:DC-1的渗透测试
数据库·python·网络安全
qincjun42 分钟前
文件I/O操作:C++
开发语言·c++
CodeClimb1 小时前
【华为OD-E卷-最左侧冗余覆盖子串 100分(python、java、c++、js、c)】
java·python·华为od
深度学习lover1 小时前
<项目代码>YOLO Visdrone航拍目标识别<目标检测>
python·yolo·目标检测·计算机视觉·visdrone航拍目标识别
小马超会养兔子1 小时前
如何写一个数字老虎机滚轮
开发语言·前端·javascript·vue