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();

results matching ""

    No results matching ""