控件查找器
from ascript.android.node import Selector
控件查找器,通过约束方法
,和查询方法
,来获取屏幕中满足条件的控件
.
方法
控件缓存
是否启用控件缓存机制.
启用后,控件将不在刷新,请及时释放缓存
启用后,查找速度将有大幅度提升.
- 函数
Selector.cache(is_cache:bool)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
is_cache | bool | 是 | True:打开缓存,缓存当前页面所有控件 False:关闭缓存 |
- 示例
# 开启缓存
from ascript.android.node import Selector
Selector.cache(True)
# 关闭控件缓存
from ascript.android.node import Selector
Selector.cache(False)
创建查找器
创建一个控件查找器
- 函数
#class
Selector(mode:int)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
mode | int | 否 | 检索模式 0(默认):普通检索模式,这种模式下只展示重要控件 1:复杂模式,这种模式下展示所有控件.层级会很深 2:简单模式下过滤掉系统控件. 3:复杂模式下过滤掉系统控件 |
- 示例
from ascript.android.node import Selector
# 创建一个选择器,简单模式检索
selector = Selector()
from ascript.android.node import Selector
# 创建一个选择器 ,复杂模式检索
Selector(1)
from ascript.android.node import Selector
# 创建一个选择器 ,简单模式,并且过滤掉系统控件
Selector(0|2)
from ascript.android.node import Selector
# 创建一个选择器 ,复杂模式,并且过滤 掉系统控件
Selector(1|2)
查找控件一个
查找控件,返回一个满足条件的控件
- 函数
#class
Selector(mode:int).find()
- 返回值
Node 控件对象
- 示例
#案例:查找出符合条件的第一个控件
from ascript.android.node import Selector
node = Selector().find()
if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')
查找控件全部
查找控件,返回满足条件的控件
- 函数
#class
Selector(mode:int).find_all(num:int=999999)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
num | int | 否 | 控件结果最大数量 默认:满足条件的所有 |
- 返回值
Node[] 控件对象列表
- 示例
#案例:查找出所有符合条件的控件
from ascript.android.node import Selector
nodes = Selector().find_all()
if nodes:
#找到了一组控件
print( len(nodes) )
else:
print('没有找到任何控件')
获取控件树
获取完整的控件树,返回Json树状格式
- 函数
#class
Selector.dump(mode:int=0)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
mode | int | 否 | 检索模式 0(默认):普通检索模式,这种模式下只展示重要控件 1:复杂模式,这种模式下展示所有控件.层级会很深 2:简单模式下过滤掉系统控件. 3:复杂模式下过滤掉系统控件 |
- 返回值
Json 数据 ,可转换为Python字典
- 示例
#案例:获取控件树json数据,并转换为字典
import json
# 导入节点检索模块
from ascript.android.node import Selector
res = Selector.dump()
print(res) # 这是json字符串
if res:
# 转换为字典对象
obj = json.loads(res);
print(obj)
属性约束
id
通过 id
约束
- 函数
Selector().id(val:str)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | str正则 | 是 | 控件ID,支持正则表达式,通常用控件查找器获取 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 导包
from ascript.android.node import Selector
# 查找id值为 “com.aojoy.airscript:id/search_bar_text” 的控件
node = Selector().id("com.aojoy.airscript:id/search_bar_text").find()
if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')
# 案例2: 在id约束中使用正则表达式
# 导包
from ascript.android.node import Selector
# 查找id值为 ‘search_bar_text结尾’ 的控件 ,在正则中 ‘.’代表任何值,‘*’代表出现多次,‘^’代表以什么开头,‘$’代表以什么结尾
node = Selector().id(".*search_bar_text$").find()
if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')
文本
通过 text
约束
- 函数
Selector().text(val:str)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | str正则 | 是 | 屏幕中显示的任意文本 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 案例1: 在text约束中使用完整文本
# 导包
from ascript.android.node import Selector
# 查找文本为 '开发者'
node = Selector().text("开发者").find()
if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')
# 案例2: 在text约束中使用正则匹配 所有文本中包含 'AirScript' 的控件
# 导包
from ascript.android.node import Selector
# 查找 文本 中包含 了‘IP’ 的控件
nodes = Selector().text(".*IP.*").find_all()
if nodes:
#找到了控件
print( len(nodes))
else:
print('没有找到任何控件')
类型
通过 type
约束
- 函数
Selector().type(val:str)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | str正则 | 是 | 控件的类型 如:TextView, ListView 等等 通常用控件查找器获取 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
#案例: 查找出 所有类型为 TextView 的控件
# 导包
from ascript.android.node import Selector
# 约束 type 为“TextView”
nodes = Selector().type("TextView").find_all()
if nodes:
#找到了控件
for node in nodes:
print(node)
else:
print('没有找到任何控件')
描述
通过 控件描述desc
约束
- 函数
Selector().desc(val:str)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | str正则 | 是 | 控件的描述信息 通常用控件查找器获取 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
#案例: 查找出 描述信息为 ‘这是关闭按钮’ 的控件
# 导包
from ascript.android.node import Selector
# 约束 desc 为“这是关闭按钮”
node = Selector().desc("这是关闭按钮").find()
if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')
默认文本
通过控件 默认文本 hintText
约束
- 函数
Selector().hintText(val:str)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | str正则 | 是 | 控件的默认文本 通常用控件查找器获取 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
#案例: 查找出 默认文本 包含 “小程序” 的控件
# 导包
from ascript.android.node import Selector
# 约束 hint_text 包含 “小程序” 的控件
node = Selector().hintText(".*小程序.*").find()
if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')
包名
通过控件 包名 packageName
约束
- 函数
Selector().packageName(val:str)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | str正则 | 是 | 控件的所属包名 通常用控件查找器获取 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
#案例: 查找出 包名 为 com.aojoy.airscript 的控件
from ascript.android.node import Selector
nodes = Selector().packageName("com.aojoy.airscript").find_all()
if nodes:
#找到了控件
print(nodes)
else:
print('没有找到任何控件')
路径
通过控件 路径 path
约束
- 函数
Selector().path(val:str)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | str正则 | 是 | 控件的路径 通常用控件查找器获取 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
#案例: 查找出 路径 为 /FrameLayout/LinearLayout/FrameLayout/EditText 的控件
from ascript.android.node import Selector
node = Selector().path("/FrameLayout/LinearLayout/FrameLayout/EditText").find()
if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')
子控件数量
通过控件 子控件数量 childCount
约束
- 函数
Selector().childCount(val:int)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | int | 是 | 子控件的数量 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
#案例1: 查找 子控件个数 为 13 的控件
# 导包
from ascript.android.node import Selector
node = Selector().childCount(13).find()
if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')
#案例2: 查找 子控件个数 为 6-7 之间, 9-13 之间的 所有
# 导包
from ascript.android.node import Selector
# 约束 desc 为“这是关闭按钮”
nodes = Selector().childCount(6.7,9.13).find_all()
if nodes:
#找到了控件
for n in nodes:
print(n)
else:
print('没有找到任何控件')
输入类型
通过控件 输入类型 inputType
约束
- 函数
Selector().inputType(val:int)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | int | 是 | 控件的输入类型 通常用控件查找器获取 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 案例: 查找输入类型为 524289 的 控件
# 导包
from ascript.android.node import Selector
# 约束 输入类型 为1
node = Selector().inputType(524289).find()
if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')
绘制排序
通过控件 绘制排序 drawingOrder
约束
绘制排序,部分情况下会变化.请不要过度依赖该属性
- 函数
Selector().drawingOrder(val:int)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | int | 是 | 控件的绘制排名 通常用控件查找器获取 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 案例: 查找出 绘制序列属性 为38的控件
# 导包
from ascript.android.node import Selector
# 约束 drawingOrder 属性为2的控件
node = Selector().drawingOrder(38).find()
if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')
控件深度
通过控件 控件深度 depth
约束
- 函数
Selector().depth(val:int):
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | int | 是 | 控件的层级深度 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 案例: 查找出 绘制深度属性 为4的控件
# 导包
from ascript.android.node import Selector
node = Selector().depth(4).find()
if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')
最大文本长度
通过控件 最大文本长度 maxTextLength
约束
- 函数
Selector().maxTextLength(val:int)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | int | 是 | 控件的最大文本内容长度 通常用控件查找器获取 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 案例: 查找最大文本长度 限制为 5000 的 控件
# 导包
from ascript.android.node import Selector
# 约束 最大文本长 度 为 50
node = Selector().maxTextLength(5000).find()
if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')
是否可点击 约束
通过控件 clickable
约束
- 函数
Selector().clickable(val:bool)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | bool | 是 | True:可以点击 ,False:不可点击 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 案例: 查找出当前页面中 所有可以被点击的控件
# 导包
from ascript.android.node import Selector
# 约束 可以点击
nodes = Selector().clickable(True).find_all()
if nodes:
#找到了控件
for node in nodes:
print(node)
else:
print('没有找到任何控件')
是否可以被选中
通过控件 checkable
约束
- 函数
Selector().checkable(val:bool)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | bool | 是 | True:可被选中 ,False:不可被选中 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
#案例: 查找出当前页面中 所有可以选中的控件
# 导包
from ascript.android.node import Selector
# 约束 可以选中
nodes = Selector().checkable(True).find_all()
if nodes:
#找到了控件
for node in nodes:
print(node)
else:
print('没有找到任何控件')
是否选中
通过控件 checked
约束
- 函数
Selector().checked(val:bool)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | bool | 是 | True:已选中 ,False:未选中 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 案例: 查找出当前页面中 所有已经选中的控件
# 导包
from ascript.android.node import Selector
# 约束 可以选中
nodes = Selector().checked(True).find_all()
if nodes:
#找到了控件
for node in nodes:
print(node)
else:
print('没有找到任何控件')
是否可编辑
通过控件 editable
约束
- 函数
Selector().editable(val:bool)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | bool | 是 | True:可编辑 ,False:不可编辑 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
#案例: 查找出当前页面中 所有可以编辑文本的控件
# 导包
from ascript.android.node import Selector
# 约束 可以编辑
nodes = Selector().editable(True).find_all()
if nodes:
#找到了控件
for node in nodes:
print(node)
else:
print('没有找到任何控件')
是否可访问
通过控件 enabled
约束
- 函数
Selector().enabled(val:bool)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | bool | 是 | True:可操作,如点击,输入 ,False:不可操作,点击,输入无效 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
#案例: 查找出当前页面中 所有不可以访问的控件
# 导包
from ascript.android.node import Selector
# 约束 不可以访问
nodes = Selector().enabled(False).find_all()
if nodes:
#找到了控件
for node in nodes:
print(node)
else:
print('没有找到任何控件')
是否可被关闭
通过控件 dismissable
约束
- 函数
Selector().dismissable(val:bool)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | bool | 是 | True:可关闭 ,False:不可关闭 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
#案例: 查找出当前页面中 所有可以被关闭的控件
# 导包
from ascript.android.node import Selector
# 约束 不可以访问
nodes = Selector().dismissable(True).find_all()
if nodes:
#找到了控件
for node in nodes:
print(node)
else:
print('没有找到任何控件')
是否可以获取焦点
通过控件 focusable
约束
- 函数
Selector().focusable(val:bool)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | bool | 是 | True:可获取焦点 ,False:不允许获取焦点 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 案例: 查找出当前页面中 所有所有可以被获取焦点的控件
# 导包
from ascript.android.node import Selector
# 约束 可以获取焦点的控件
nodes = Selector().focusable(True).find_all()
if nodes:
#找到了控件
for node in nodes:
print(node)
else:
print('没有找到任何控件')
是否有焦点
通过控件 focused
约束
- 函数
Selector().focused(val:bool)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | bool | 是 | True:已获取焦点 ,False:没有焦点 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
#案例: 查找出当前页面中 所有所有可以被获取焦点的控件
# 导包
from ascript.android.node import Selector
# 约束 已经获取焦点
node = Selector().focused(True).find()
if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')
是否显示中
通过控件 visible
约束
- 函数
Selector().visible(val:bool)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | bool | 是 | True:显示在屏幕上 False:隐藏或在屏幕之外 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 案例: 查找出,所有用户不可见的控件
# 导包
from ascript.android.node import Selector
nodes = Selector().visible(False).find_all()
if nodes:
#找到了控件
for node in nodes:
print(node)
else:
print('没有找到任何控件')
是否支持长按
通过控件 longClickable
约束
- 函数
Selector().longClickable(val:bool)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
val | bool | 是 | True:支持 False:不支持 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
#案例: 查找出当前页面中 所有支持长按的控件
# 导包
from ascript.android.node import Selector
# 约束 已经获取焦点
nodes = Selector().longClickable(True).find_all()
if nodes:
#找到了控件
for node in nodes:
print(node)
else:
print('没有找到任何控件')
关系约束
获取父控件
通过控件 parent
约束
- 函数
Selector().parent(*val:float)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
*val | float可变参数 | 是 | 获取第val个父控件默认获取所有父元素 (2):获取爷爷元素 (3):获取太爷爷元素 (1,3):获取第1和第3个父元素 (1.3):获取第1-3 之间的所有父元素 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 案例1: 获取指定 id控件的 所有父元素(父元素,爷爷元素,太爷爷,祖太爷...统统获取)
# 导包
from ascript.android.node import Selector
# 约束 获取所有父元素
nodes = Selector().id("com.aojoy.airscript:id/search_bar_text").parent().find_all();
if nodes:
#找到了控件
for node in nodes:
print(node)
else:
print('没有找到任何控件')
# 案例2: 获取指定 id控件的 太爷爷元素
# 导包
from ascript.android.node import Selector
nodes = Selector().id("com.aojoy.airscript:id/search_bar_text").parent(3).find_all();
if nodes:
#找到了控件
for node in nodes:
print(node)
else:
print('没有找到任何控件')
# 案例3: 获取父元素,太太爷元素
# 导包
from ascript.android.node import Selector
nodes = Selector().id("com.aojoy.airscript:id/search_bar_text").parent(1,3).find_all();
if nodes:
#找到了控件
for node in nodes:
print(node)
else:
print('没有找到任何控件')
# 案例4: 获取往上数3辈 所有元素
# 导包
from ascript.android.node import Selector
# 约束 获取1-3 之间的所有父元素
nodes = Selector().id("com.aojoy.airscript:id/search_bar_text").parent(1.3).find_all();
if nodes:
#找到了控件
for node in nodes:
print(node)
else:
print('没有找到任何控件')
获取子控件
通过控件 child
约束
- 函数
Selector().child(*val:float)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
*val | float可变参数 | 是 | 获取第val个子控件默认获取所有孩子控件 (1):获取第1个孩子控件 (-1):获取倒数第1个孩子 (1.3):获取1-3之间的所有孩子 (-1.3):获取倒数 1-3之间的所有孩子 (1,3):获取第1个和第3个子控件 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 案例1: 获取所有孩子
# 导包
from ascript.android.node import Selector
# 约束 默认无参下,获取所有
nodes = Selector().id("com.aojoy.airscript:id/search_query_section").child().find_all();
if nodes:
#找到了控件
for node in nodes:
print(node.type)
else:
print('没有找到任何控件')
# 案例2: 获取第一个孩子
# 导包
from ascript.android.node import Selector
# 约束 获取第一个孩子
nodes = Selector().id("com.aojoy.airscript:id/search_query_section").child(1).find_all();
if nodes:
#找到了控件
for node in nodes:
print(node.type)
else:
print('没有找到任何控件')
# 案例3: 获取第1和 第2个孩子
# 导包
from ascript.android.node import Selector
# 约束 可变参数,填写多个
nodes = Selector().id("com.aojoy.airscript:id/search_query_section").child(1,2).find_all();
if nodes:
#找到了控件
for node in nodes:
print(node.type)
else:
print('没有找到任何控件')
# 案例4: 获取第1-3个孩子
# 导包
from ascript.android.node import Selector
# 约束 填写一个小数,获取区间孩子
nodes = Selector().id("com.aojoy.airscript:id/search_query_section").child(1.3).find_all();
if nodes:
#找到了控件
for node in nodes:
print(node.type)
else:
print('没有找到任何控件')
# 案例5: 获取第倒数第一个孩子
# 导包
from ascript.android.node import Selector
# 约束 负数,倒数取值
nodes = Selector().id("com.aojoy.airscript:id/search_query_section").child(-1).find_all();
if nodes:
#找到了控件
for node in nodes:
print(node.type)
else:
print('没有找到任何控件')
# 案例6: 获取第倒数第1-3 个孩子
# 导包
from ascript.android.node import Selector
# 约束 负数,倒数区间取值
nodes = Selector().id("com.aojoy.airscript:id/search_query_section").child(-1.3).find_all();
if nodes:
#找到了控件
for node in nodes:
print(node.type)
else:
print('没有找到任何控件')
获取兄弟控件
通过控件 brother
约束
- 函数
Selector().brother(*val:float)
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
*val | float可变参数 | 是 | 获取第val个子控件默认获取所有兄弟控件 (1):获取第1个兄弟控件 (1,2):获取第1和第2个兄弟控件 (1.4):获取1-4之间的所有兄弟控件 (0.1):获取当前控件的下一个兄弟控件 (-0.1):获取当前控件的上一个兄弟控件 (-1):获取倒数第1个兄弟控件 |
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 案例1: 获取所有兄弟
# 导包
from ascript.android.node import Selector
nodes = Selector().desc(".*充电.*").brother().find_all();
if nodes:
#找到了控件
for node in nodes:
print(node.desc)
else:
print('没有找到任何控件')
# 案例2: 获取第一个兄弟控件
# 导包
from ascript.android.node import Selector
nodes = Selector().desc(".*充电.*").brother(1).find_all();
if nodes:
#找到了控件
for node in nodes:
print(node.desc)
else:
print('没有找到任何控件')
# 案例3: 获取第1和第2个兄弟控件
# 导包
from ascript.android.node import Selector
nodes = Selector().desc(".*充电.*").brother(1,2).find_all();
if nodes:
#找到了控件
for node in nodes:
print(node.desc)
else:
print('没有找到任何控件')
# 案例4:获取1-4之间的所有兄弟控件
# 导包
from ascript.android.node import Selector
nodes = Selector().desc(".*充电.*").brother(1.4).find_all();
if nodes:
#找到了控件
for node in nodes:
print(node.desc)
else:
print('没有找到任何控件')
# 案例5:获取当前控件的下一个兄弟控件
# 导包
from ascript.android.node import Selector
nodes = Selector().desc(".*充电.*").brother(0.1).find_all();
if nodes:
#找到了控件
for node in nodes:
print(node.desc)
else:
print('没有找到任何控件')
# 案例6:获取当前 控件的上一个兄弟控件
# 导包
from ascript.android.node import Selector
nodes = Selector().desc(".*充电.*").brother(-0.1).find_all();
if nodes:
#找到了控件
for node in nodes:
print(node.desc)
else:
print('没有找到任何控件')
# 案例7:获取倒数第1个兄弟控件
# 导包
from ascript.android.node import Selector
nodes = Selector().desc(".*充电.*").brother(-1).find_all();
if nodes:
#找到了控件
for node in nodes:
print(node.desc)
else:
print('没有找到任何控件')
动作约束
点击控件
通过控件 click
约束
- 函数
Selector().click()
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 查找 到指定控件,执行点击方法, “点击方法也是约束的一种,因此不能忘记后面的find或_find_all”
#导包
from ascript.android.node import Selector
Selector().type("ImageView").id("com.aojoy.airscript:id/iv_statue1").click().find()
长按控件
通过控件 long_click
约束
- 函数
Selector().long_click()
- 返回值
Selector 返回控件查找器,用于链式编程
- 示例
# 指定控件 长按操作
from ascript.android.node import Selector
node = Selector().id("com.aojoy.airscript:id/gv_historyrun").child(1).long_click().find()