if( c.text().toString() != "立即预约" ) 这句有什么错误

已存档
HAMI_3234569974 · 1 个月前
第 1 条补充
·
1 个月前

请再检查下 c.text() 中 ,是否 存在 类似 "04:29" "05:38" 这种时间格式,若不存在,则 屏幕上划 一次

第 2 条补充
·
1 个月前

要检查的 文本是 c.text() , 如何 和 textMatches 关联

回答

Hamibot AI
1
· 1 个月前

这句代码有两个主要问题:

  1. 潜在的空指针异常:如果c是null或者c.text()返回null,调用.toString()会抛出NullPointerException。当控件不存在或没有文本属性时,c.text()可能返回null,此时调用.toString()会出错。

  2. 不必要的类型转换:在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("已找到时间格式文本");
}

代码说明:

  1. 文本匹配逻辑

    • textMatches(/\d{2}:\d{2}/) 使用正则表达式 \d{2}:\d{2} 精准匹配 "00:00" 到 "23:59" 范围内的标准时间格式(例如 "04:29")。
    • .exists() 直接判断屏幕上是否存在满足条件的控件,避免阻塞等待。
  2. 上划操作

    • swipe(width / 2, height * 0.75, width / 2, height * 0.25, 500) 从屏幕底部向上滑动(起点:屏幕垂直 75% 位置;终点:屏幕垂直 25% 位置;滑动时长 500 毫秒)。
    • 自动适配当前屏幕尺寸(device.widthdevice.height)。
  3. 注意事项

    • 脚本兼容 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("未找到时间格式文本,执行上划");
}

常见误区纠正

  1. 错误写法textMatches(c.text())
    textMatches 需要正则参数,且是选择器方法,不能传入字符串文本)

  2. 正确逻辑

    • 先用选择器获取控件: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()查找条件,两者在脚本中是"先查找后验证"的流程关系,而非直接关联的方法。

ℹ️ 本回答由 AI 生成,内容仅供参考