app基础操作api
前置代码 # This sample code uses the Appium python client # pip install Appium-Python-Client # Then you can paste this into a file and simply run with Pythonfrom appium import webdriver from appium.webdriver.common.touch_action import TouchAction import timecaps = {} caps["platformName"] = "Android" caps["deviceName"] = "SM-N9760" caps["platformVersion"] = "7.1.2" caps["appPackage"] = "com.android.settings" caps["appActivity"] = "com.android.settings.Settings"driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
通过id定位
方法:find_element_by_id(id_value) #id_value:为元素的id属性值
代码实现:
driver.find_element_by_id("com.android.settings:id/search").click()
driver.quit()
通过class定位
方法:find_element_by_class_name(class_value) # class_value:为元素的class属性值
代码实现:# id 点击搜索按钮driver.find_element_by_id("com.android.settings:id/search").click()# class 点击输入框返回按钮driver.find_element_by_class_name('android.widget.ImageButton').click()driver.quit()
通过xpath定位
方法:find_element_by_xpath(xpath_value) # xpath_value:为可以定位到元素的xpath语句代码实现:
# xpath 点击WLAN按钮
driver.find_element_by_xpath("//*[contains(@text,'WLA')]").click()
通过id方式定位一组元素
方法: find_elements_by_id(id_value) # id_value:为元素的id属性值
代码实现:
# 定位到一组元素
title = driver.find_elements_by_id("com.android.settings:id/title")
# 打印title类型,预期为list
print(type(title))
# 取title返回列表中的第一个定位对象,执行点击操作
title[0].click()
通过class方式定位一组元素
方法:find_elements_by_class_name(class_value) # class_value:为元素的class属性值
代码实现:
# 定位到一组元素
title = driver.find_elements_by_class_name("android.widget.TextView")
# 打印title类型,预期为list
print(type(title))
# 取title返回列表中的第一个定位对象,执行点击操作
title[3].click()
通过xpath方式定位一组元素
方法:find_elements_by_xpath(xpath_value) # xpath_value:为可以定位到元素的xpath语句
代码实现:
# 定位到一组元素
title = driver.find_elements_by_xpath("//*[contains(@class,'widget.TextView')]")
# 打印title类型,预期为list
print(type(title))
# 取title返回列表中的第一个定位对象,执行点击操作
title[3].click()
WebDriverWait 显示等待操作
方法:WebDriverWait(driver, timeout, poll_frequency).until(method)
代码实现:
from selenium.webdriver.support.wait import WebDriverWait # 导入WebDriverWait类
# 超时时间为30s,每隔1秒搜索一次元素是否存在,如果元素存在返回定位对象并退出
search_button = WebDriverWait(driver, 30, 1).until(lambda driver: driver.find_element_by_id("com.android.settings:id/search"))
search_button.click()
driver.quit()
发送数据到输入框
方法:send_keys(vaue) # value:需要发送到输入框内的文本
代码实现:
# 点击搜索按钮
driver.find_element_by_id("com.android.settings:id/search").click()
# 定位到输入框并输入abc
driver.find_element_by_id("android:id/search_src_text").send_keys("abc")重点:
大家可以将输入的abc 改成 输入中文,得到的结果:输入框无任何值输入且程序不会抱错
解决输入中文问题:1.server 启动参数增加两个参数配置
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True2.再次运行会发现运行成功
# 点击搜索按钮
driver.find_element_by_id("com.android.settings:id/search").click()
# 定位到输入框并输入abc
driver.find_element_by_id("android:id/search_src_text").send_keys("博客")
清空输入框内容
方法:clear()
代码实现:
# 点击搜索按钮
driver.find_element_by_id("com.android.settings:id/search").click()
# 定位到输入框并输入abc
input_text = driver.find_element_by_id("android:id/search_src_text")
# 输入abc
input_text.send_keys("abc")
time.sleep(1)
# 删除abc
input_text.clear()
获取元素的文本内容
方法: text
代码实现:
text_vlaue = driver.find_elements_by_class_name("android.widget.TextView")
for i in text_vlaue:
print(i.text)
获取元素的属性值
方法: get_attribute(value) # value:元素的属性
⚠️ value='name' 返回content-desc / text属性值
⚠️ value='text' 返回text的属性值
⚠️ value='className' 返回 class属性值,只有 API=>18 才能支持
⚠️ value='resourceId' 返回 resource-id属性值,只有 API=>18 才能支持
代码实现:
# 定位到搜索按钮
get_value = driver.find_element_by_id("com.android.settings:id/search")
print(get_value.get_attribute("content-desc"))
获取元素在屏幕上的坐标
方法:location
代码实现:
# 定位到搜索按钮
get_value = driver.find_element_by_id("com.android.settings:id/search")
# 打印搜索按钮在屏幕上的坐标
print(get_value.location)
获取app包名和启动名
获取包名方法:current_package
获取启动名:current_activity
代码实现:
print(driver.current_package)
print(driver.current_activity)
swip滑动事件
⚠️从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动
方法:swipe(start_x, start_y, end_x, end_y, duration=None)
参数:
1.start_x:起点X轴坐标
2.start_y:起点Y轴坐标
3.end_x: 终点X轴坐标
4.end_y,: 终点Y轴坐标
5.duration: 滑动这个操作一共持续的时间长度,单位:ms
代码实现:
# 滑动没有持续时间
driver.swipe(188,659,148,248)
# 滑动持续5秒的时间
driver.swipe(188,659,148,248,5000)
scroll滑动事件
⚠️ 从一个元素滑动到另一个元素,直到页面自动停止
方法:scroll(origin_el, destination_el)
参数:
1.origin_el:滑动开始的元素
2.destination_el:滑动结束的元素
代码实现:
# 定位到存储菜单栏
el1 = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
# 定位到WLAN菜单栏
el2 = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
# 执行滑动操作
driver.scroll(el1,el2)
drag拖拽事件
⚠️ 从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的位置
方法:drag_and_drop(origin_el, destination_el)
代码实现:
# 定位到存储菜单栏
el1 = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
# 定位到WLAN菜单栏
el2 = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
# 执行滑动操作
driver.drag_and_drop(el1,el2)
应用置于后台事件
APP放置后台,模拟热启动
方法:background_app(seconds)
代码实现:
driver.background_app(5)
手指轻敲操作
模拟手指轻敲一下屏幕操作
方法:tap(element=None, x=None, y=None)
方法:perform() # 发送命令到服务器执行操作代码实现:
# 通过元素定位方式敲击屏幕
el = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
TouchAction(driver).tap(el).perform()# 通过坐标方式敲击屏幕,WLAN坐标:x=155,y=250
# TouchAction(driver).tap(x=155,y=250).perform()
手指按操作
方法:press(el=None, x=None, y=None)
方法:release() # 结束动作,手指离开屏幕
参数:
1.element:被定位到的元素
2.x:通常会使用元素的X轴坐标
3.y:通常会使用元素的Y轴坐标
代码实现:
# 通过元素定位方式按下屏幕
el = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
TouchAction(driver).press(el).release().perform()# 通过坐标方式按下屏幕,WLAN坐标:x=155,y=250
# TouchAction(driver).press(x=155,y=250).release().perform()
等待操作
方法:wait(ms=0)
参数:
ms:暂停的毫秒数
代码实现:
# 点击WLAN
driver.find_element_by_xpath("//*[contains(@text,'WLAN')]").click()
# 定位到WiredSSID
el =driver.find_element_by_id("android:id/title")
# 通过元素定位方式长按元素
TouchAction(driver).press(el).wait(5000).perform()# 通过坐标方式模拟长按元素
# 添加等待(有长按)/不添加等待(无长按效果)
# TouchAction(driver).press(x=770,y=667).wait(5000).release().perform()
手指长按操作
方法:long_press(el=None, x=None, y=None, duration=1000)
参数:
1.element:被定位到的元素
2.x:通常会使用元素的X轴坐标
3.y:通常会使用元素的Y轴坐标
4.duration:持续时间,默认为1000ms
代码实现:
# 点击WLAN
driver.find_element_by_xpath("//*[contains(@text,'WLAN')]").click()
# 定位到WiredSSID
el =driver.find_element_by_id("android:id/title")
# 通过元素定位方式长按元素
TouchAction(driver).long_press(el,duration=5000).release().perform()# 通过坐标方式长按元素,WiredSSID坐标:x=770,y=667
# 添加等待(有长按)/不添加等待(无长按效果)
# TouchAction(driver).long_press(x=770,y=667).perform()
手指移动操作
方法:move_to(el=None, x=None, y=None)
参数:
1.el:定位的元素
2.x:相对于前一个元素的X轴偏移量
3.y:相对于前一个元素的Y轴偏移量
代码实现:
# 定位到存储
el = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
# 定位到更多
el1 = driver.find_element_by_xpath("//*[contains(@text,'更多')]")
# 元素方式滑动
TouchAction(driver).press(el).move_to(el1).release().perform()
# 坐标的方式滑动
# TouchAction(driver).press(x=240,y=600).wait(100).move_to(x=240,y=100).release().perform()
# 注意press连接一个move_to实际调用的是swip方法,可在log中查询,不要给相对坐标。
业务场景2:
1.进入设置
2.向上滑动屏幕到可见"安全"选项
3.进入到安全
4.点击屏幕锁定方式
5.点击图案
6.绘制图案代码实现:
time.sleep(2) # 定位到WLAN el1 = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]") time.sleep(2) # 定位到存储 el2 = driver.find_element_by_xpath("//*[contains(@text,'声音')]") # 存储上滑到WLAN driver.drag_and_drop(el2,el1) time.sleep(2) # 定位到用户 el3 = driver.find_element_by_xpath("//*[contains(@text,'用户')]") # 注意 这次使用drag_and_drop方法,传入的"存储定位"仍使用其原始在屏幕上的位置,所以是由存储滑动到用户才可以上滑,否则需要重新"定位存储" # 存储上滑到用户位置 driver.drag_and_drop(el3,el2) # 点击安全按钮 driver.find_element_by_xpath("//*[contains(@text,'安全')]").click() time.sleep(2) # 点击屏幕锁定方式按钮 driver.find_element_by_xpath("//*[contains(@text,'屏幕锁定')]").click() time.sleep(2) # 点击图案按钮 driver.find_element_by_xpath("//*[contains(@text,'图案')]").click() time.sleep(2) # 绘制图案四个坐标 TouchAction(driver).press(x=654,y=630).wait(100).move_to(x=446,y=847).wait(100).\move_to(x=450,y=1047).wait(100).move_to(x=654,y=843).release().perform()注:尽量每行都加上强制休眠,防止页面在未加载完毕就运行下一行代码,导致报错,然后从第一个滑动的到第二个滑动的时候,第二个滑动的要必须是在刚打开模拟器或者真机设置的时候就能够看见的,然后当第二个滑动到第三个的时候,你可以先把第一个定为设置,也可以在存储上滑倒第三个代码中顺序调换一下,不然会往上滑动。
获取手机时间
方法:device_time
代码实现:
# 获取当前手机的时间
print(driver.device_time)
获取手机的宽高
获取手机的宽高,可以根据宽高做一些坐标的操作
方法:get_window_size()
代码实现:
print(driver.get_window_size())
发送键到设备
模拟系统键值的操作,比如操作honme键,音量键,返回键等。
方法:keyevent(keycode, metastate=None):
参数:
keycode:发送给设备的关键代码
metastate:关于被发送的关键代码的元信息,一般为默认值
代码实现:
for i in range(3):
driver.keyevent(24)
操作手机通知栏
打开手机的通知栏,可以获取通知栏的相关信息和元素操作
方法:open_notifications()
代码实现:
driver.open_notifications()
获取手机当前网络
方法:network_connection
代码实现:
print(driver.network_connection)
设置手机网络
方法:set_network_connection(connectionType)
参数:
connectionType:需要被设置成为的网络类型
代码实现:
driver.set_network_connection(1) #飞行模式
手机截图
方法:get_screenshot_as_file(filename)
参数:
filename:指定路径下,指定格式的图片
代码实现:
import os
driver.get_screenshot_as_file(os.getcwd() + os.sep + './screen.png')
app基础操作api相关推荐
- 软件测试笔记_15_Appium自动化测试框架、操作API
移动端Appium等价于web端selenium 一.Appium介绍 Appium 移动端自动化测试框架 用于测试原生应用(纯java).移动端网页应用(html css)和混合型应用(java h ...
- APP自动化测试框架搭建(六)--uiautomator2、web-editor基础操作
第一章 APP自动化环境搭建(Mac版) 第二章 APP自动化环境搭建(Windows版) 第三章 adb命令 第四章 元素定位.元素操作 第五章 APP自动化测试框架搭建 Python+Appium ...
- Kudu入门和API基础操作
Kudu入门和API基础操作 文章目录 Kudu入门和API基础操作 为什么使用Kudu作为存储介质 1. Kudu介绍 1.1 背景介绍 1.2 新的硬件设备 1.3 Kudu是什么 1.4 Kud ...
- php 动态彩码辨色 接口的调用_好用的云函数!后端低代码接口开发,零基础编写API接口...
前言 在开发项目过程中,经常需要用到API接口,实现对数据库的CURD等操作. 不管你是专业的PHP开发工程师,还是客户端开发工程师,或者是不懂编程但懂得数据库SQL查询,又或者是完全不太懂技术的人, ...
- Django的基础操作总结
Django的基础操作总结 1:准备开始 建立一个新的project: django-admin.py startproject XXXXXX(名称) 建立一个新的App:python manage. ...
- Pywin32操控Excel——1. 基础操作
介绍 pywin32是一个方便Python开发者快速调用Windows API的第三方模块库,在这边我们只学习关于操控Excel的部分,而且不会讲的很全,只是对于openpyxl缺点部分进行补充. 安 ...
- 好用的云函数!后端低代码接口开发,零基础编写API接口
前言 在开发项目过程中,经常需要用到API接口,实现对数据库的CURD等操作. 不管你是专业的PHP开发工程师,还是客户端开发工程师,或者是不懂编程但懂得数据库SQL查询,又或者是完全不太懂技术的人, ...
- 学习笔记Spark(七)—— Spark SQL应用(2)—— Spark DataFrame基础操作
二.Spark DataFrame基础操作 2.1.DataFrame DataFrame是一种不可变的分布式数据集,这种数据集被组织成指定的列,类似于关系数据库中的表. 数据集的每一列都带有名称和类 ...
- 计算机基础- -操作系统环境
计算机基础- -操作系统环境 文章目录 计算机基础- -操作系统环境 一.操作系统环境 二.Windows操作系统克服了CPU以外的硬件差异 三.不同操作系统的API差异性 四.FreeBSD Por ...
最新文章
- python学习笔记day08 文件功能详解
- php 中 fastcgi
- EMNLP 2020 《MUTANT: A Training Paradigm for Out-of-Distribution Generalization in VQA》论文笔记
- 探索ArrayList自动改变size真相
- Spring boot web(2):web综合开发
- SequenceFile文件
- Git学习系列(六)解决分支冲突及分支管理策略
- linux环境内存查询指令,帮助你检查Linux系统内存及其使用情况的命令
- /bin/sh: cc: 未找到命令
- ReflectionZ_测试_01
- Servlet3.0 jsp跳转到Servlet 出现404错误的路径设置方法
- (附源码)计算机毕业设计ssm大学生网络安全题库系统
- 【ECU】汽车电子/嵌入式工程师学习网站、资源、路线
- 什么是CDN加速技术?网站用CDN有什么好处
- 北航计算机学院王静远,北京航空航天大学计算机学院导师教师师资介绍简介-李帅...
- SQL AlawaysOn 之四:故障转移集群
- 不会产生ICMP差错报文的情况
- 判断清浊音 matlab,基于MATLAB的语音信号的清浊音分析.docx
- 笔记工具:幕布 简要使用教程
- python读取excel成绩表,并设置柱状图
热门文章
- MIME之quoted-printable编码与base64编码(例题+图解)
- 云服务部署FastDFS遇到tracker一直选举的问题???file: tracker_relationship.c, line: 383, selecting leaderer
- 李宏毅深度学习面试题P20
- vue.config.js配置,webpack打包配置详解
- 百度AI攻略:手势识别
- 转:公司数字化转型,你可能做反了
- python图像处理基础知识(plt库函数说明)
- Redis 哨兵模式原理
- Linux 安装小皮面板(php study)
- json类型大小 mysql_MySQL JSON数据类型