view 视图操作——模拟点击、坐标定位、控件查找
核心用法
view 模块需要在目标应用的 UI 线程上运行,通常配合 Java.perform 使用。
查找视图
// 通过 ID 查找
var btn = view.findById('com.example.app:id/btn_buy');
// 通过文字查找
var okBtn = view.findByText('确定');
// 遍历所有视图
view.traverse(function (view) {
console.log('[+] 找到视图: ' + view.className + ', id=' + view.id + ', text=' + view.text);
});
模拟点击
// 点一下找到的按钮
view.click(btn);
// 按坐标点(屏幕绝对坐标)
view.click(500, 800);
// 长按
view.longClick(500, 800);
读取视图信息
var info = view.getInfo(btn);
console.log('[+] 控件类型: ' + info.className);
console.log('[+] 控件文字: ' + info.text);
console.log('[+] 位置: (' + info.left + ',' + info.top + ') - (' + info.right + ',' + info.bottom + ')');
console.log('[+] 是否可见: ' + info.visible);
console.log('[+] 是否启用: ' + info.enabled);
模拟滑动
// 从 (100, 500) 滑到 (900, 500)
view.swipe(100, 500, 900, 500);
输入文字
var inputField = view.findById('com.example.app:id/et_username');
view.input(inputField, 'test_user');
典型场景
自动点确认
目标应用弹窗问"确定购买吗?",自动帮你点确定:
Java.perform(function () {
var okBtn = view.findByText('确定');
if (okBtn) {
console.log('[+] 找到确定按钮,自动点击');
view.click(okBtn);
}
});
跳过广告弹窗
有些应用启动时弹广告,几秒后出现「跳过」按钮,可以 Hook Activity.onCreate 后自动查找并点击:
Java.perform(function () {
var Activity = Java.use('com.example.app.MainActivity');
Activity.onCreate.implementation = function (bundle) {
this.onCreate(bundle);
// 延迟 3 秒找跳过按钮
setTimeout(function () {
var skipBtn = view.findByText('跳过');
if (skipBtn) view.click(skipBtn);
}, 3000);
};
});
坐标获取
不知道按钮坐标?可以用 view 模块遍历所有可见视图,打印它们的坐标范围:
Java.perform(function () {
view.traverse(function (v) {
var info = view.getInfo(v);
if (info.visible) {
console.log(info.text + ' → (' + info.left + ',' + info.top + ')');
}
});
});
注意事项
UI 线程限制
view 模块的所有操作必须在目标应用的 UI 线程上执行。如果你用 setTimeout 延迟执行,记得切到 UI 线程:
setTimeout(function () {
Java.perform(function () {
// 在这里调 view 模块
});
}, 3000);
内核模式不可用
如果 JsHook 运行在内核驱动模式,view 模块不可用——观察者进程没有目标应用的 UI 上下文。详见 内核模式可用/不可用 API。