if( c.text().toString() != "立即预约" ) 这句有什么错误
请再检查下 c.text() 中 ,是否 存在 类似 "04:29" "05:38" 这种时间格式,若不存在,则 屏幕上划 一次
要检查的 文本是 c.text() , 如何 和 textMatches 关联
回答
这句代码有两个主要问题:
-
潜在的空指针异常:如果
c是null或者c.text()返回null,调用.toString()会抛出NullPointerException。当控件不存在或没有文本属性时,c.text()可能返回null,此时调用.toString()会出错。 -
不必要的类型转换:在Hamibot中,
text()方法已经返回字符串类型,不需要再调用.toString()。这是多余的转换操作。
正确的写法应该是:
if (!c || c.text() != "立即预约")
或者更安全的写法(同时检查c是否存在和文本是否为空):
if (!c || !c.text() || c.text() != "立即预约")
这样修改后:
- 首先检查
c是否存在 - 再检查
c.text()是否有值 - 最后比较文本内容
这种写法避免了空指针异常,也符合Hamibot的API设计规范。文档地址 https://docs.hamibot.com/
补充回答 1
要检查屏幕上是否存在类似 "04:29" 或 "05:38" 的时间格式文本(即两位数字+冒号+两位数字),若不存在则执行一次屏幕向上滑动操作,可以使用以下 Hamibot 脚本。该脚本基于控件自动化技术,通过正则表达式匹配文本内容,无需 OCR 识别:
// 文档地址 https://docs.hamibot.com/
if (!textMatches(/\d{2}:\d{2}/).exists()) {
var width = device.width;
var height = device.height;
swipe(width / 2, height * 0.75, width / 2, height * 0.25, 500);
toastLog("未找到时间格式文本,执行上划完成");
} else {
toastLog("已找到时间格式文本");
}
代码说明:
-
文本匹配逻辑:
textMatches(/\d{2}:\d{2}/)使用正则表达式\d{2}:\d{2}精准匹配 "00:00" 到 "23:59" 范围内的标准时间格式(例如 "04:29")。.exists()直接判断屏幕上是否存在满足条件的控件,避免阻塞等待。
-
上划操作:
swipe(width / 2, height * 0.75, width / 2, height * 0.25, 500)从屏幕底部向上滑动(起点:屏幕垂直 75% 位置;终点:屏幕垂直 25% 位置;滑动时长 500 毫秒)。- 自动适配当前屏幕尺寸(
device.width和device.height)。
-
注意事项:
- 脚本兼容 Hamibot 的 Rhino 1.7.15 引擎,未使用箭头函数等高级语法。
- 如果时间格式可能包含额外字符(如 "时间:04:29"),正则表达式仍能匹配;如需严格匹配独立时间文本,可改用
textMatches(/^\d{2}:\d{2}$/)。 - 执行前确保已启用 无障碍服务(Hamibot 自动化依赖无障碍权限)。
将此代码直接添加到你的脚本中即可运行。如果需要调整滑动距离或匹配规则,可修改 height 系数或正则表达式部分。
补充回答 2
在 Hamibot 中,c.text() 和 textMatches() 是两种不同用途的方法,需要明确它们的区别才能正确关联:
核心区别
c.text():获取已找到的控件对象c的文本内容(返回字符串)textMatches():是选择器方法,用于查找屏幕上满足条件的控件(返回选择器对象)
正确关联方式
要检查特定控件 c 的文本是否符合时间格式,应该直接对 c.text() 的返回值进行正则匹配:
// 文档地址 https://docs.hamibot.com/
// 假设 c 是已获取到的控件对象
if (c && /^\d{2}:\d{2}$/.test(c.text())) {
toastLog("找到时间格式文本: " + c.text());
} else {
// 执行上划操作
var width = device.width;
var height = device.height;
swipe(width / 2, height * 0.75, width / 2, height * 0.25, 500);
toastLog("未找到时间格式文本,执行上划完成");
}
完整使用场景示例
如果你需要遍历多个控件检查时间格式:
// 文档地址 https://docs.hamibot.com/
// 1. 先获取所有可能包含时间的控件(例如列表项)
var list = id("list_id").findOne();
var hasTimeFormat = false;
// 2. 遍历子控件检查每个控件的文本
list.children().forEach(function(child) {
var textContent = child.text();
if (textContent && /^\d{2}:\d{2}$/.test(textContent)) {
hasTimeFormat = true;
log("找到时间格式: " + textContent);
return false; // 找到后停止遍历
}
});
// 3. 判断是否需要上划
if (!hasTimeFormat) {
var width = device.width;
var height = device.height;
swipe(width / 2, height * 0.75, width / 2, height * 0.25, 500);
toastLog("未找到时间格式文本,执行上划");
}
常见误区纠正
-
错误写法:
textMatches(c.text())❌
(textMatches需要正则参数,且是选择器方法,不能传入字符串文本) -
正确逻辑:
- 先用选择器获取控件:
var c = textMatches(/\d{2}:\d{2}/).findOne(); - 再检查控件是否存在:
if (c) { ... } - 或直接检查文本:
if (/^\d{2}:\d{2}$/.test(c.text())) { ... }
- 先用选择器获取控件:
选择器直接查找的替代方案
如果目标是先查找含时间格式的控件,再决定是否上划:
// 文档地址 https://docs.hamibot.com/
if (textMatches(/\d{2}:\d{2}/).findOne(1000)) {
toastLog("找到时间格式文本");
} else {
// 执行上划
swipe(device.width/2, device.height*0.7, device.width/2, device.height*0.3, 500);
}
关键点:c.text() 是获取结果,textMatches() 是查找条件,两者在脚本中是"先查找后验证"的流程关系,而非直接关联的方法。