Python自动化测试---Appium

devtools/2024/11/15 1:44:21/

常用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)

http://www.ppmy.cn/devtools/133669.html

相关文章

Android Studio | 最新版本配置要求高,JDK运行环境不适配,导致无法启动App

Android Studio 的最新版本配置要求比较高,这时候需要降低插件的版本,才能正常启动项目 build.gradle 文件的 dependencies 部分中,使用 libs 作为一些常用库的别名。这些别名在项目的 gradle.properties 文件或者某个特定的 versions.prope…

2024 年 8 个最佳 API 设计工具图文介绍

8 个最佳 API 设计工具推荐,包括 Apifox、Postman、Swagger、Insomnia、Stoplight、Hoppscotch、RapidAPI和Paw。 详细介绍:2024 年 8 个最佳 API 设计工具推荐

《JavaEE进阶》----20.<基于Spring图书管理系统①(登录+添加图书)>

PS:关于接口定义 接口定义,通常由服务器提供方来定义。 1.路径:自己定义 2.参数:根据需求考虑,我们这个接口功能完成需要哪些信息。 3.返回结果:考虑我们能为对方提供什么。站在对方角度考虑。 我们使用到的…

DiskGenius工具扩容Mac OS X Apple APFS分区

DiskGenius是一款功能强大的磁盘分区工具,它支持Windows和Mac OS X系统,可以用于管理硬盘分区,包括扩容Mac OS X的Apple APFS分区。然而,直接使用DiskGenius来扩容Mac OS X的APFS分区可能存在一定的风险,因为不是专门为…

【Docker】Docker基础及docker-compose

一、Docker下载 更新yum包 yum update 安装需要的软件包( yum-util 提供yum-config-manager功能,后两个是devicemapper驱动依赖) yum install -y yum-utils device-mapper-persistent-data lvm2 设置stable镜像仓库(使用阿里…

vue3+vite 前端打包不缓存配置

最近遇到前端部署后浏览器得清缓存才能出现最新页面效果得问题 所以…按以下方式配置完打包就没啥问题了,原理很简单就是加个时间戳 /* eslint-disable no-undef */ import {defineConfig, loadEnv} from vite import path from path import createVitePlugins from…

Docker部署Nginx服务器并实现HTTPS自动重定向

背景:近期有个互联网项目,因是面向C端用户,从安全考虑,请求应该是https,从用户体验角度,应让用户输入域名,而不是ip:port,但一般浏览器都是发起HTTP请求,例如&#xff0c…

数学基础 -- 线性代数之线性无关

线性无关 在线性代数中,线性无关列指的是矩阵中的列向量之间不满足线性组合关系,即无法通过其他列向量的线性组合来表示某一个列向量。简单地说,一组向量是线性无关的,意味着其中任何一个向量不能由其他向量生成。 1. 线性无关的…