Skip to main content

控件查找器

from ascript.android.node import Selector

控件查找器,通过约束方法,和查询方法,来获取屏幕中满足条件的控件.

方法

控件缓存

是否启用控件缓存机制.

info

启用后,控件将不在刷新,请及时释放缓存

启用后,查找速度将有大幅度提升.

  • 函数
Selector.cache(is_cache:bool)
  • 参数
参数类型是否必填说明
is_cacheboolTrue:打开缓存,缓存当前页面所有控件
False:关闭缓存
  • 示例
# 开启缓存
from ascript.android.node import Selector

Selector.cache(True)
# 关闭控件缓存
from ascript.android.node import Selector

Selector.cache(False)

创建查找器

创建一个控件查找器

  • 函数
#class
Selector(mode:int)
  • 参数
参数类型是否必填说明
modeint检索模式
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)
  • 参数
参数类型是否必填说明
numint控件结果最大数量 默认:满足条件的所有
  • 返回值

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)
  • 参数
参数类型是否必填说明
modeint检索模式
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)
  • 参数
参数类型是否必填说明
valstr正则控件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)
  • 参数
参数类型是否必填说明
valstr正则屏幕中显示的任意文本
  • 返回值

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)
  • 参数
参数类型是否必填说明
valstr正则控件的类型 如: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)
  • 参数
参数类型是否必填说明
valstr正则控件的描述信息 通常用控件查找器获取
  • 返回值

Selector 返回控件查找器,用于链式编程

  • 示例
#案例: 查找出 描述信息为 ‘这是关闭按钮’ 的控件

# 导包
from ascript.android.node import Selector

# 约束 desc 为“这是关闭按钮”
node = Selector().desc("这是关闭按钮").find()

if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')

默认文本

通过控件 默认文本 hintText 约束

  • 函数
Selector().hintText(val:str)
  • 参数
参数类型是否必填说明
valstr正则控件的默认文本 通常用控件查找器获取
  • 返回值

Selector 返回控件查找器,用于链式编程

  • 示例
#案例: 查找出 默认文本 包含 “小程序” 的控件

# 导包
from ascript.android.node import Selector

# 约束 hint_text 包含 “小程序” 的控件
node = Selector().hintText(".*小程序.*").find()

if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')

包名

通过控件 包名 packageName 约束

  • 函数
Selector().packageName(val:str)
  • 参数
参数类型是否必填说明
valstr正则控件的所属包名 通常用控件查找器获取
  • 返回值

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)
  • 参数
参数类型是否必填说明
valstr正则控件的路径 通常用控件查找器获取
  • 返回值

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)
  • 参数
参数类型是否必填说明
valint子控件的数量
  • 返回值

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)
  • 参数
参数类型是否必填说明
valint控件的输入类型 通常用控件查找器获取
  • 返回值

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)
  • 参数
参数类型是否必填说明
valint控件的绘制排名 通常用控件查找器获取
  • 返回值

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):
  • 参数
参数类型是否必填说明
valint控件的层级深度
  • 返回值

Selector 返回控件查找器,用于链式编程

  • 示例
# 案例: 查找出 绘制深度属性 为4的控件

# 导包
from ascript.android.node import Selector

node = Selector().depth(4).find()

if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')

最大文本长度

通过控件 最大文本长度 maxTextLength 约束

  • 函数
Selector().maxTextLength(val:int)
  • 参数
参数类型是否必填说明
valint控件的最大文本内容长度 通常用控件查找器获取
  • 返回值

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)
  • 参数
参数类型是否必填说明
valboolTrue:可以点击,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)
  • 参数
参数类型是否必填说明
valboolTrue:可被选中,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)
  • 参数
参数类型是否必填说明
valboolTrue:已选中,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)
  • 参数
参数类型是否必填说明
valboolTrue:可编辑,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)
  • 参数
参数类型是否必填说明
valboolTrue:可操作,如点击,输入,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)
  • 参数
参数类型是否必填说明
valboolTrue:可关闭,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)
  • 参数
参数类型是否必填说明
valboolTrue:可获取焦点,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)
  • 参数
参数类型是否必填说明
valboolTrue:已获取焦点,False:没有焦点
  • 返回值

Selector 返回控件查找器,用于链式编程

  • 示例
#案例: 查找出当前页面中 所有所有可以被获取焦点的控件

# 导包
from ascript.android.node import Selector

# 约束 已经获取焦点
node = Selector().focused(True).find()

if node:
#找到了控件
print(node)
else:
print('没有找到任何控件')

是否显示中

通过控件 visible 约束

  • 函数
Selector().visible(val:bool)
  • 参数
参数类型是否必填说明
valboolTrue:显示在屏幕上 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)
  • 参数
参数类型是否必填说明
valboolTrue:支持 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)
  • 参数
参数类型是否必填说明
*valfloat可变参数获取第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)
  • 参数
参数类型是否必填说明
*valfloat可变参数获取第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)
  • 参数
参数类型是否必填说明
*valfloat可变参数获取第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()

滑动控件

通过控件 slide 约束

  • 函数
Selector().slide(ore:int=1)
  • 参数
参数类型是否必填说明
oreint滑动方向
1:向前滑动-(默认)
-1:向后滑动
  • 返回值

Selector 返回控件查找器,用于链式编程

  • 示例
# 查找 到指定可控件 ,执行向后滑动
#导包
from ascript.android.node import Selector

Selector().type("RecyclerView").slide(1).find()

向控件输入信息

通过控件 input 约束

  • 函数
Selector().input(msg:str="")
  • 参数
参数类型是否必填说明
msgstr输入的信息
"":清空输入框中的值 (默认)
  • 返回值

Selector 返回控件查找器,用于链式编程

  • 示例
# 查找 到指定可控件 , 输入‘自在老师’
#导包
from ascript.android.node import Selector

Selector().id("com.aojoy.airscript:id/search_bar_text").input("自在老师").find()