1. 说明
这个章节主要讲解选择器类使用和节点信息类
2. 选择器对象
- 选择器对象是支持级联选择,可以在无法直接选择到元素的时候,先通过选择父级后再选择子级
- 选择器部分支撑正则匹配,请参考java的正则语法,教程
2.1. 基本用法 S.get()
除了基本用法,还可以使用属性名方法直接快捷选择
function main(){
//获取选择器对象,但是这个选择器是没有任何条件属性的
var selector = S.get();
}
main();
2.2. text属性选择
2.2.1. 全文本匹配
function main(){
//获取选择器对象
var selector = text("设置");
click(selector);
}
main();
2.2.2. 正则匹配
function main(){
//获取选择器对象
var selector = textMatch(".*设置.*");
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.3. id 属性选择
2.3.1. 全量匹配
function main(){
//获取选择器对象
var selector = id("com.tencent.mm:id/a1");
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.3.2. 正则匹配
function main(){
//获取选择器对象
var selector = idMatch(".*id8.*");
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.4. clz 属性选择
2.4.1. 全量匹配
function main(){
//获取选择器对象
var selector = clz("android.widget.TextView");
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.4.2. 正则匹配
function main(){
//获取选择器对象
var selector = clzMatch(".*TextView.*");
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.5. pkg 属性选择
2.5.1. 全量匹配
function main(){
//获取选择器对象
var selector = pkg("com.tencent.mm");
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.5.2. 正则匹配
function main(){
//获取选择器对象
var selector = pkgMatch(".*tencent.*");
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.6. desc 文本属性选择
2.6.1. 全量匹配
function main(){
//获取选择器对象
var selector = desc("我是描述");
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.6.2. 正则匹配
function main(){
//获取选择器对象
var selector = descMatch(".*描述.*");
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main()
2.7. 深度和绘制顺序匹配
- 主要目标是为了消除动态ID(例如抖音等)、相同的ID带来的问题
2.7.1. drawingOrder
function main(){
//获取选择器对象
var selector = drawingOrder(1);
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.7.2. depth
function main(){
//获取选择器对象
var selector = depth(1);
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.8. 其他匹配规则
2.8.1. visible 可视化属性匹配
- 按照属性 visible 进行匹配
- @param value 字符串
- @return {S} 节点选择器
function main(){
var node = visible(true).getOneNodeInfo(1000);
logd("node "+node);
}
main();
2.8.2. bounds 范围匹配
- 按照属性 bounds 进行范围 *
- @param left 范围左边数值
- @param top 范围上边数值
- @param right 范围右边数值
- @param bottom 范围底边数值
- @return {S} 节点选择器
function main(){
//获取选择器对象 0 - 800以内范围内的控件
var selector = bounds(0,0,800,800);
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.8.3. checkable
function main(){
//获取选择器对象
var selector = checkable(true);
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.8.4. checked
function main(){
//获取选择器对象
var selector = checked(true);
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.8.5. clickable
function main(){
//获取选择器对象
var selector = clickable(true);
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.8.6. longClickable
function main(){
//获取选择器对象
var selector = longClickable(true);
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.8.7. scrollable
function main(){
//获取选择器对象
var selector = scrollable(true);
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.8.8. focusable
function main(){
//获取选择器对象
var selector = focusable(true);
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.8.9. enabled
function main(){
//获取选择器对象
var selector = enabled(true);
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.8.10. focused
function main(){
//获取选择器对象
var selector = focused(true);
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.8.11. selected
function main(){
//获取选择器对象
var selector = selected(true);
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.8.12. index
function main(){
//获取选择器对象
var selector = index(1);
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.8.13. childCount
function main(){
//获取选择器对象
var selector = childCount(1);
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.9. 级联匹配
function main(){
//获取选择器对象
//选择 父级为android.widget.ScrollView下的子节点clz=android.widget.CheckBox所有节点
var selector = clz("android.widget.ScrollView")
.child()
.clz("android.widget.CheckBox");
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
2.10. 多属性匹配
function main(){
//获取选择器对象,
//选择包含"选择器"并且checked=true并且类名=android.widget.CheckBox的元素
var selector = text(".*选择器.*")
.checked(true)
.clz("android.widget.CheckBox");
var result = click(selector);
if (result) {
toast("点击成功");
} else {
toast("点击失败");
}
}
main();
3. 节点信息类
节点对象NodeInfo,可以通过获取getNodeInfo方法获取到节点信息的数组,节点包含的信息如下
- id: 字符串,资源的ID
- clz: 字符串,视图类名,例如 android.widget.TextView
- pkg: 字符串,包名,例如com.tencent.mm
- desc: 字符串,内容描述
- text: 字符串,文本
- checkable: 布尔型,是否可选中
- checked: 布尔型,是否选中
- clickable: 布尔型,是否可点击
- enabled: 布尔型,是否启用
- focusable: 布尔型,是否可获取焦点
- focused: 布尔型,是否聚焦
- longClickable: 布尔型,是否可长点击
- scrollable: 布尔型,是否滚动
- selected: 布尔型,是否被选择
- childCount: 整型,子节点的个数
- index: 整型 节点的索引
- depth: 整型 节点的层级深度
- drawingOrder: 整型 节点的绘制顺序
- bounds: Rect型,空间对象
- top: 整型,顶部位置
- bottom: 整型,底部位置
- left: 整型,左边位置
- right: 整型,右边位置
- visibleBounds: Rect型,可视空间对象
- top: 整型,顶部位置
- bottom: 整型,底部位置
- left: 整型,左边位置
- right: 整型,右边位置
3.1. 选择器获取一个节点 getOneNodeInfo
- 通过选择器 获取第一个节点信息
- @param timeout 等待时间,单位是毫秒, 如果是0,代表不等待
- @return NodeInfo 对象 或者null
function main(){
//获取选择器对象
//选择 节点 clz=android.widget.CheckBox所有节点,
var node = clz("android.widget.CheckBox").getOneNodeInfo(10000);
if (node) {
var x= node.click();
logd(x);
} else {
toast("无节点");
}
}
main();
3.2. 选择器获取多个节点 getNodeInfo
- 获取节点信息
- @param timeout 等待时间,单位是毫秒, 如果是0,代表不等待
- @return NodeInfo 节点信息集合
function main(){
//获取选择器对象
//选择 节点 clz=android.widget.CheckBox所有节点,
var node = clz("android.widget.CheckBox").getNodeInfo(10000);
logd(node);
}
main();
3.3. 级联获取一个子节点操作 getOneNodeInfo
- 通过选择器 获取第一个节点信息
- @param timeout 等待时间,单位是毫秒, 如果是0,代表不等待
- @return NodeInfo 对象 或者null
function main(){
//获取选择器对象
//选择 节点 clz=android.widget.ViewGroup 所有节点,
var node = clz("android.widget.ViewGroup").getOneNodeInfo(10000);
if (node) {
//获取子节点
node =node.getOneNodeInfo(text("广告"),10000);
if (!node){
toast("无子节点");
return;
}
var x= node.click();
logd(x);
} else {
toast("无节点");
}
}
main();
3.4. 级联获取多个子节点操作 getNodeInfo
- 获取节点信息
- @param timeout 等待时间,单位是毫秒, 如果是0,代表不等待
- @return NodeInfo 节点信息集合
function main(){
//获取选择器对象
//选择 节点 clz=android.widget.ViewGroup 所有节点,
var node = clz("android.widget.ViewGroup").getNodeInfo(10000);
if (node) {
//获取子节点
node =node.getNodeInfo(text("广告").clz("android.widget.TextView"),10000);
if (!node){
toast("无子节点");
return;
}
var x= node.click();
logd(x);
} else {
toast("无节点");
}
}
main();
3.5. 获取父节点 parent
- 该节点的父级节点
- @return NodeInfo 对象 或者null
function main(){
//获取选择器对象
//选择 节点 clz=android.widget.CheckBox所有节点
var node = clz("android.widget.CheckBox").getOneNodeInfo(10000);
if (node) {
var x= node.parent();
logd(x);
} else {
toast("无节点");
}
}
main();
3.6. 获取子节点 child
- 取得单个子节点
- @param index 子节点索引
- @return NodeInfo 对象 或者null
function main(){
//选择 节点 clz=android.widget.ViewGroup 所有节点
var node = clz("android.widget.ViewGroup").getOneNodeInfo(10000);
if (node) {
var x= node.child(0);
logd(x);
} else {
toast("无节点");
}
}
main();
3.7. 获取所有子节点 allChildren
- 获取所有子节点
- @return NodeInfo 节点集合
function main(){
//选择 节点 clz=android.widget.ViewGroup 所有节点
var node = clz("android.widget.ViewGroup").getOneNodeInfo(10000);
if (node) {
var x= node.allChildren();
logd(x);
} else {
toast("无节点");
}
}
main();
3.8. 所有兄弟节点 siblings
- 当前节点的所有兄弟节点
- @return NodeInfo 节点集合
function main(){
//选择 节点 clz=android.widget.ViewGroup 所有节点
var node = clz("android.widget.ViewGroup").getOneNodeInfo(10000);
if (node) {
var x= node.siblings();
logd(x);
} else {
toast("无节点");
}
}
main();
3.9. 前面的兄弟节点 previousSiblings
- 在当前节点前面的兄弟节点
- @return NodeInfo 节点集合
function main(){
//选择 节点 clz=android.widget.ViewGroup 所有节点
var node = clz("android.widget.ViewGroup").getOneNodeInfo(10000);
if (node!=null) {
var x= node.previousSiblings();
logd(x);
} else {
toast("无节点");
}
}
main();
3.10. 后面的兄弟节点 nextSiblings
- 在当前节点后面的兄弟节点
- @return NodeInfo 节点集合
function main(){
//选择 节点 clz=android.widget.ViewGroup 所有节点
var node = clz("android.widget.ViewGroup").getOneNodeInfo(10000);
if (node) {
var x= node.nextSiblings();
logd(x);
} else {
toast("无节点");
}
}
main();
3.11. 节点区域随机点击 click
- 点击节点
- @return bool, true 成功 ,false 失败
function main(){
//获取选择器对象
//选择 节点 clz=android.widget.CheckBox所有节点
var node = clz("android.widget.CheckBox").getOneNodeInfo(10000);
if (node) {
node.click()
} else {
toast("无节点");
}
}
main();
3.12. 节点点击中心点 clickCenter
- 节点点击中心点
- @return bool, true 成功 ,false 失败
function main(){
//获取选择器对象
//选择 节点 clz=android.widget.CheckBox所有节点
var node = clz("android.widget.CheckBox").getOneNodeInfo(10000);
if (node) {
node.clickCenter();
} else {
toast("无节点");
}
}
main();
3.13. 节点长点击 longClick
- 长点击节点
- @return bool, true 成功 ,false 失败
function main(){
//获取选择器对象
//选择 节点 clz=android.widget.CheckBox所有节点
var node = clz("android.widget.CheckBox").getOneNodeInfo(10000);
if (node) {
node.longClick()
} else {
toast("无节点");
}
}
main();
3.14. 节点输入 inputText
- 对某个节点输入数据
- @param content 要输入的内容
- @return bool, true 成功 ,false 失败
function main(){
//获取选择器对象
//选择 节点 clz=android.widget.EditText 所有节点
var node = clz("android.widget.EditText").getOneNodeInfo(10000);
if (node) {
node.inputText("内容")
} else {
toast("无节点");
}
}
main();
3.15. 节点输入法输入 imeInputText
- 使用输入法对某个节点输入数据,前提是已经设置本程序的输入法为默认输入法
- @param content 要输入的内容
- @return bool, true 成功 ,false 失败
function main(){
//获取选择器对象
//选择 节点 clz=android.widget.EditText 所有节点
var node = clz("android.widget.EditText").getOneNodeInfo(10000);
if (node) {
node.imeInputText("内容")
} else {
toast("无节点");
}
}
main();
3.16. 节点数据清除 clearText
- 清除节点文本数据
function main(){
//获取选择器对象
//选择 节点 clz=android.widget.EditText 所有节点
var node = clz("android.widget.EditText").getOneNodeInfo();
if (node) {
var r =node.clearText();
logd("r -=> "+r);
} else {
toast("无节点");
}
}
main();
3.17. 节点刷新 refresh
- 该方法会刷新节点缓存
function main(){
//获取选择器对象
//选择 节点 clz=android.widget.EditText 所有节点
var node = clz("android.widget.EditText").getOneNodeInfo(10000);
if (node) {
node.refresh();
} else {
toast("无节点");
}
}
main();
3.18. 节点有效判断 isValid
- 节点信息是否有效 @return bool|布尔型 true代表有
function main(){
//获取选择器对象
//选择 节点 clz=android.widget.EditText 所有节点
var node = clz("android.widget.EditText").getOneNodeInfo(10000);
if (node) {
var x =node.isValid();
toast("节点有效性:"+x);
} else {
toast("无节点");
}
}
main();