节点函数
说明
- 节点模块函数主要是跟节点操作相关联
- 该模块没有模块前缀,可以直接调用函数
- 由于IOS的限制,可能部分机器获取节点过慢,建议获取节点后进行锁定节点后,在进行查找
- 也可以使用设置节点获取参数的方式进行
- 不适合的页面:比如适配播放页面等
锁定节点三种方式:
| 函数 | 适用场景 | 说明 |
|---|---|---|
lockNode | USB 直连 | 经 USB 从手机拉 XML 并锁定到 PC 缓存 |
lockNodeFromXml | WiFi + Aux | 将 auxEvent.agentDumpXml() 等外部 XML 注入 PC 缓存并锁定(适配 9.39.0+) |
releaseNode | 通用 | 释放锁定,恢复为界面刷新后重新拉取 |
WiFi 场景完整流程见 lockNodeFromXml;对象形式可用 agentEvent.lockNodeFromXml(xml),见 代理事件。
setFetchNodeParam 设置节点参数
- 设置获取节点的基础参数,这个参数可以有效减少获取节点的数量和消耗的时间
- 支持版本: EC iOS 中控 3.0.0+
- @param ext 是一个map,例如
{"visibleFilter":1} - visibleFilter 1 代表不管visible是true还是false都获取,2 代表只获取 visible=true的节点
- labelFilter 1 代表不管label是否有值都获取,2 代表只获取label有值的节点
- boundsFilter 1 代表不过滤 2 bounds 区域属性x,y,w,h都小于0就被过滤
- maxDepth 代表要获取节点的层级,越少速度越快,建议 1 - 500
- maxChildCount 最大获取子节点数量,0代表不限制
- excludedAttributes 代表要过滤的属性,用英文逗号分割,可以增加抓取速度,例如 visible,selected,enable
- @return
{bool}true 成功,false 失败
function main() { // 脚本开头执行一次即可 var data = setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": "visible,selected,enable,accessible"}) logd(data);}
main();lockNode 锁定节点
- 经 USB 从手机拉取节点 XML 并锁定到 PC 侧缓存;锁定后界面刷新也不会更新已缓存的节点树,需配合
releaseNode解锁 - 支持版本: EC iOS 中控 3.0.0+
- 与
setFetchNodeParam配合可缩小抓取范围、加快速度
function main() { setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2"}); releaseNode(); lockNode();
let nd = label("设置").getOneNodeInfo(1000); logd("node: {}", nd ? JSON.stringify(nd) : "null");}
main();lockNodeFromXml 从 XML 锁定节点
- 将外部 XML 字符串注入 PC 侧节点缓存并锁定,可与 auxEvent.agentDumpXml 配合,再继续使用本模块的选择器(
label().getNodeInfo()等) - 适配版本 EC iOS 中控 9.39.0+
- 对象形式:
agentEvent.lockNodeFromXml(xml),见 代理事件 - lockNodeFromXml - @param xml XML 字符串(如
auxEvent.agentDumpXml()的返回值) - @return
{bool}true 成功,false 失败
function main() { auxEvent.ensureWifiSession(""); auxEvent.agentStartEnv(); auxEvent.agentSetFetchNodeParam({ labelFilter: "2", maxDepth: "20", visibleFilter: "2" });
let xml = auxEvent.agentDumpXml(); logd("xml length: {}", xml ? xml.length : 0); if (!xml) { logd("agentDumpXml 失败"); return; }
releaseNode(); let ok = lockNodeFromXml(xml); logd("lockNodeFromXml: {}", ok); if (!ok) { return; }
let nd = label("设置").getOneNodeInfo(0); logd("node: {}", nd ? JSON.stringify(nd) : "null");}
main();releaseNode 释放节点
- 释放节点锁定;释放后
getNodeInfo等会按最新界面重新拉取 XML - 支持版本: EC iOS 中控 3.0.0+
- 与
lockNode、lockNodeFromXml配对使用
function main() { setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2"}); releaseNode(); lockNode();
let nd = label("设置").getOneNodeInfo(1000); logd("locked: {}", nd ? JSON.stringify(nd) : "null");
releaseNode(); logd("节点锁已释放");}
main();getNodeInfo 获取节点集合
- timeout 超时时间,单位毫秒
- 支持版本: EC iOS 中控 3.0.0+
- @return
{array}节点对象集合
function main() { var data = label("aaa").getNodeInfo(1000); logd(JSON.stringify(data));}
main();getOneNodeInfo 获取单节点
- timeout 超时时间,单位毫秒
- 支持版本: EC iOS 中控 3.0.0+
- @return
{NodeInfo}节点对象
function main() { var data = label("aaa").getOneNodeInfo(1000); logd(JSON.stringify(data));}
main();以下是选择器函数
id id 属性全匹配
- id 属性全匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 // 脚本开头执行一次即可 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 id 查找 let nd = id("设置").getOneNodeInfo(1000) if (nd) { console.log("id 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log("id 未查找 节点信息 ") } // 按照 正则表达式匹配 nd = idMatch(".*置.*").getNodeInfo(1000) if (nd) { console.log("idMatch 查找 节点信息 {} ", JSON.stringify(nd)) } else { console.log("idMatch 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()xpath 选择
- xpath选择器,xpath技术请看 : https://www.jianshu.com/p/c205334122b3 和 https://www.runoob.com/xpath/xpath-syntax.html
- xpath使用请到idea的节点面板查看xpath属性以及测试xpath功能
- 适配EC 7.7.0+
- @param value 例如 //node[@value=‘易点云测’] 代表选取文本等于易点云测的节点
function main() { //获取选择器对象 var selector = xpath("//node[@value='易点云测']"); let n = selector.getNodeInfo(1000); logd(JSON.stringify(n))}
main();idMatch id 属性正则匹配
- id 属性正则匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 id 查找 let nd = id("设置").getOneNodeInfo(1000) if (nd) { console.log("id 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log("id 未查找 节点信息 ") } // 按照 正则表达式匹配 nd = idMatch(".*置.*").getNodeInfo(1000) if (nd) { console.log("idMatch 查找 节点信息 {} ", JSON.stringify(nd)) } else { console.log("idMatch 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()label label属性全匹配
- label属性全匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照label查找 let nd = label("设置").getOneNodeInfo(1000) if (nd) { console.log("label 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log("label 未查找 节点信息 ") } // 按照 正则表达式匹配 nd = labelMatch(".*置.*").getNodeInfo(1000) if (nd) { console.log("labelMatch 查找 节点信息 {} ", JSON.stringify(nd)) } else { console.log("labelMatch 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()labelMatch label属性正则匹配
- label属性正则匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照label查找 let nd = label("设置").getOneNodeInfo(1000) if (nd) { console.log("label 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log("label 未查找 节点信息 ") } // 按照 正则表达式匹配 nd = labelMatch(".*置.*").getNodeInfo(1000) if (nd) { console.log("labelMatch 查找 节点信息 {} ", JSON.stringify(nd)) } else { console.log("labelMatch 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()name name属性全匹配
- name 属性全匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 name 查找 let nd = name("设置").getOneNodeInfo(1000) if (nd) { console.log("name 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log("name 未查找 节点信息 ") } // 按照 name 正则表达式匹配 nd = nameMatch(".*置.*").getNodeInfo(1000) if (nd) { console.log("nameMatch 查找 节点信息 {} ", JSON.stringify(nd)) } else { console.log("nameMatch 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()nameMatch name属性正则匹配
- name 属性正则匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 name 查找 let nd = name("设置").getOneNodeInfo(1000) if (nd) { console.log("name 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log("name 未查找 节点信息 ") } // 按照 name 正则表达式匹配 nd = nameMatch(".*置.*").getNodeInfo(1000) if (nd) { console.log("nameMatch 查找 节点信息 {} ", JSON.stringify(nd)) } else { console.log("nameMatch 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()type type属性全匹配
- type 属性全匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 type 查找 let nd = type("XCUIElementTypeOther").getOneNodeInfo(1000) if (nd) { console.log("type 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log("label 未查找 节点信息 ") } // 按照 type 正则表达式匹配 nd = typeMatch(".*XCUIElement.*").getNodeInfo(1000) if (nd) { console.log("typeMatch 查找 节点信息 {} ", JSON.stringify(nd)) } else { console.log("typeMatch 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()typeMatch type属性正则匹配
- type 属性正则匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 type 查找 let nd = type("XCUIElementTypeOther").getOneNodeInfo(1000) if (nd) { console.log("type 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log("label 未查找 节点信息 ") } // 按照 type 正则表达式匹配 nd = typeMatch(".*XCUIElementTypeOther.*").getNodeInfo(1000) if (nd) { console.log("typeMatch 查找 节点信息 {} ", JSON.stringify(nd)) } else { console.log("ltypeMatch 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()value value属性全匹配
- value 属性全匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 value 查找 let nd = value("XCUIElementTypeOther").getOneNodeInfo(1000) if (nd) { console.log("value 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log("value 未查找 节点信息 ") } // 按照 type 正则表达式匹配 nd = valueMatch(".*XCUIElementTypeOther.*").getNodeInfo(1000) if (nd) { console.log("valueMatch 查找 节点信息 {} ", JSON.stringify(nd)) } else { console.log("valueMatch 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()valueMatch value属性正则匹配
- value 属性正则匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 value 查找 let nd = value("XCUIElementTypeOther").getOneNodeInfo(1000) if (nd) { console.log("value 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log("value 未查找 节点信息 ") } // 按照 type 正则表达式匹配 nd = valueMatch(".*XCUIElementTypeOther.*").getNodeInfo(1000) if (nd) { console.log("valueMatch 查找 节点信息 {} ", JSON.stringify(nd)) } else { console.log("valueMatch 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()enable enable属性全匹配
- enable 属性全匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 enable , accessible 查找 let nd = enable(true).accessible(true).getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log(" 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()accessible accessible属性全匹配
- accessible 属性全匹配
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 enabled , accessible 查找 let nd = enabled(true).accessible(true).getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log(" 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()visible visible属性全匹配
- visible 属性全匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 visible 查找 let nd = visible(true).getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log(" 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()index index属性全匹配
- index 属性全匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 index 查找 let nd = index(1).getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log(" 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()depth depth 属性全匹配
- depth 属性全匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 depth 查找 let nd = depth(1).getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log(" 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()selected selected 属性全匹配
- selected 属性全匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 selected 查找 let nd = selected(true).getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log(" 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()childcount childcount属性全匹配
- childcount 属性全匹配
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 childCount 查找 let nd = childCount(2).getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log(" 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()bounds bounds属性范围匹配
- bounds 属性范围匹配
- 支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 bounds 查找 let nd = bounds(100, 100, 300, 300).getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log(" 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()点击节点
clickCenter 点击节点中心点
- 点击节点中心点
- 支持版本: EC iOS 中控 3.0.0+
- @return
{bool}true 成功,false 失败
function main() { setFetchNodeParam({ "labelFilter": "2", "maxDepth": "70", "visibleFilter": "2", "excludedAttributes": "visible,2" }) let node = name("地图").getOneNodeInfo(10000) logd(JSON.stringify(node)) if (node) { logd(node.clickCenter()) }
}
main()clickRandom 随机点击节点
- 随机点击节点的坐标
- 支持版本: EC iOS 中控 3.0.0+
- @return
{bool}true 成功,false 失败
function main() { setFetchNodeParam({ "labelFilter": "2", "maxDepth": "70", "visibleFilter": "2", "excludedAttributes": "visible,2" }) let node = name("地图").getOneNodeInfo(10000) logd(JSON.stringify(node)) if (node) { logd(node.clickRandom()) }
}
main()多属性级联查询
支持版本: EC iOS 中控 3.0.0+
function main() { //开始再这里编写代码了!! logd("检查自动化环境...") //如果自动化服务正常 if (!autoServiceStart(3)) { logd("自动化服务启动失败,无法执行脚本") exit(); return; } logd("开始执行脚本...") // 设置读取节点的参数, 具体请看设置节点参数的含义 setFetchNodeParam({"labelFilter": "2", "maxDepth": "20", "visibleFilter": "2", "excludedAttributes": ""}) // 先释放老的数据 releaseNode(); // 锁定新的节点数据 lockNode(); // 进入查找状态 // 按照 级联模式 查找 let nd = labelMatch(".*1.*").enabled(true).accessible(true).bounds(100, 100, 300, 300).getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) // 如果找到了 就点击 let c = clickPoint(nd.bounds.centerX(), nd.bounds.centerY()); logd("点他: {}", c) } else { console.log(" 未查找 节点信息 ") } // 先释放老的数据 releaseNode();}
function autoServiceStart(time) { for (let i = 0; i < time; i++) { if (isServiceOk()) { return true; } let started = startEnv(); logd("第" + (i + 1) + "次启动服务结果: " + started); if (isServiceOk()) { return true; } } return isServiceOk();}
main()以下是节点的级联操作
parent 查询节点的父级
- 查询节点的父级
- 支持版本: EC iOS 中控 3.0.0+
- @return
{NodeInfo}节点对象
function main() { // 进入查找状态 let nd = labelMatch(".*1.*").getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) let parent = nd.parent() console.log(" 查找 parent {} ", JSON.stringify(parent)) } else { console.log(" 未查找 节点信息 ") }// 先释放老的数据 releaseNode();}
main()child 取得单个子节点
- 取得单个子节点
- 支持版本: EC iOS 中控 3.0.0+
- @param index – 子节点索引
- @return
{NodeInfo}NodeInfo 对象 或者null
function main() { // 进入查找状态 let nd = labelMatch(".*1.*").getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) let child1 = nd.child(0) console.log(" 查找 child {} ", JSON.stringify(child1)) } else { console.log(" 未查找 节点信息 ") }// 先释放老的数据 releaseNode();}
main()allChildren 取得所有子节点
- 取得所有子节点
- 支持版本: EC iOS 中控 3.0.0+
- @return
{array}NodeInfo 节点集合
function main() { // 进入查找状态 let nd = labelMatch(".*1.*").getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) let allChildren = nd.allChildren() console.log(" 查找 allChildren {} ", JSON.stringify(allChildren)) } else { console.log(" 未查找 节点信息 ") }// 先释放老的数据 releaseNode();}
main()siblings 取得所有兄弟节点
- 当前节点的所有兄弟节点
- 支持版本: EC iOS 中控 3.0.0+
- @return
{array}NodeInfo 节点集合
function main() { // 进入查找状态 let nd = labelMatch(".*1.*").getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) let siblings = nd.siblings() console.log(" 查找 siblings {} ", JSON.stringify(siblings)) } else { console.log(" 未查找 节点信息 ") }// 先释放老的数据 releaseNode();}
main()previousSiblings 取得前面的兄弟节点
- 在当前节点前面的兄弟节点
- 支持版本: EC iOS 中控 3.0.0+
- @return
{array}NodeInfo 节点集合
function main() { // 进入查找状态 let nd = labelMatch(".*1.*").getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) let previousSiblings = nd.previousSiblings() console.log(" 查找 previousSiblings {} ", JSON.stringify(previousSiblings)) } else { console.log(" 未查找 节点信息 ") }// 先释放老的数据 releaseNode();}
main()nextSiblings 取得后面的兄弟节点
- 在当前节点后面的兄弟节点
- 支持版本: EC iOS 中控 3.0.0+
- @return
{array}NodeInfo 节点集合
function main() { // 进入查找状态 let nd = labelMatch(".*1.*").getOneNodeInfo(1000) if (nd) { console.log(" 查找 节点信息 {} ", JSON.stringify(nd)) let nextSiblings = nd.nextSiblings() console.log(" 查找 nextSiblings {} ", JSON.stringify(nextSiblings)) } else { console.log(" 未查找 节点信息 ") }// 先释放老的数据 releaseNode();}
main()