Autojs常用方法&原始方法整理

概述:

Autojs有很多函数方法可以使用,但有部分不是很常用,今天对常用部分的方法整理方便以后查看,快速的的上手。

 

1、app应用相关

//================================app应用:=====================================
launchApp('微信'); //通过app应用名启动应用
launch('com.tencent.mm'); //通过包名启动应用
app.uninstall('包名'); //卸载app

var packageName=getPackageName('微信'); //通过应用名获取app包名
console.log("获取的包名:%s",packageName);
var appname=getAppName("com.tencent.mm"); //通过包名返回应用名
console.log("获取的应用名:%s",appname); //格式化输出

//打开应用的详情页(设置页),,如果找不到该应用,返回false; 否则返回true。
app.openAppSetting("com.tencent.mm");

app.viewFile("/sdcard/test.txt"); //打开文件

//打开Url(如果不以"http://"或"https://"开头则默认是"http://")
app.openUrl("https://www.wuyunai.com/docs/v8/")

 

 2、控制台相关

//=================================控制台======================================
//格式化输出
let count = 5;
let count1 = 10;
console.log('以整型方式输出count: %d', count+count1);
console.log('以字符串方式输出count: count=%s,count1=%d', count,count1);
console.log('count:', count);


//输出日志颜色
console.verbose("灰色字体显示日志");
console.info("绿色字体显示日志");
console.warn("蓝色字体显示日志");
console.error("红色字体显示日志");


//其他
toastLog('hallo word'); //toast提示+log记录
log("日志信息");//日志输出(console.log和log是一样的)
alert("标题","内容"); //对话框输出


//控制台断言(如果value为false则输出错误信息message并停止脚本运行。)
var a = 1 + 1;
console.assert(a == 2, "加法出错啦,停止脚本运行");

//设置控制台大小为屏幕的四分之一
console.show();
console.setSize(device.width / 2, device.height / 2);


//设置日志保存的路径和配置
console.setGlobalLogConfig({
    "file": "/sdcard/1.txt"
});

 

 3、设备相关

//================================设备相关=====================================
////设置无障碍模式 fast为启用缓存
auto();

a = device.height; //高度
b = device.width; //宽度
console.log('设备分辨率:'+b+'*'+a);
console.log("设备分辨率:%d *%d",a,b);

brand = device.brand;  //品牌厂商
console.log(brand);

model = device.model; // 设备型号
console.log(model);

product = device.product; // 手机型号名称
console.log(product);

//硬件序列号
serial = device.serial; // c3ba6d87a0d71433
console.log(serial);

//安卓系统API版本
sdkint = device.sdkInt; //API版本:25
console.log('API'+sdkint);

//系统版本号
release = device.release; //7.1.2
console.log(release);

//安卓id
getandroidid = device.getAndroidId(); //71433c3ba6d87a0d
console.log(getandroidid);

//MAC地址 需要联网才能获取
getmacaddress = device.getMacAddress(); //B0:FC:36:12:C9:EF
console.log(getmacaddress);

//获取媒体音量
getmusicvolume = device.getMusicVolume(); 
console.log('音量'+getmusicvolume); //音量:大小

//获取电量百分比
getbattery = device.getBattery(); //87
console.log(getbattery);

//确认设备是否在充电
ischarging = device.isCharging();
console.log(ischarging); //flase 没有在充电

//获取设备运行内存容量(占用的内存)
gettotalmem = device.getTotalMem();
console.log(gettotalmem); //3186032640 单位(字节),可以自己转换

//获取设备当前可用内存
getavailmem = device.getAvailMem();
console.log(getavailmem);  //2386280448(字节),可以自己转换

//查看屏幕是否亮着
isscreenon = device.isScreenOn();
console.log(isscreenon); //true


//唤醒设备。包括唤醒设备CPU、屏幕等(如果息屏可以点亮屏幕,亮屏就依然亮屏)
device.wakeUp();
//如果屏幕没有点亮,则唤醒设备
device.wakeUpIfNeeded()


//保持点亮屏幕(设置时间)
device.keepScreenOn(30000); //不加参数常亮,  手机亮屏时间以device.keepScreenOn为准,之前系统设置的时间作废

//保持屏幕常亮 可调节省电模式
device.keepScreenDim(timeout);

//取消设备保持唤醒状态 用来取消屏幕的唤醒状态
device.cancelKeepingAwake();

////使设备震动一段时间
device.vibrate(300);  //单位毫秒

//取消震动
device.cancelVibration();

 

 4、坐标操作

setScreenMetrics(width, height) //在width*height的设备中,坐标操作自适应
click(x, y)//点击
longClick(x, y)//长按
press(x, y, duration)//按住
swipe(x1, y1, x2, y2, duration)//滑动
swipeEx(x1, y1, x2, y2, duration)//仿真随机曲线滑动
gesture(duration, [x1, y1], [x2, y2], …)//手势路径,时长2s
gestures([delay1, duration1, [x1, y1], [x2, y2], …], [delay2, duration2, [x3, y3], [x4, y4], …], …)//延时多点手势路径

//获取并点击屏幕的中心位置
x = device.width/2; //宽度x
y = device.height/2; //高度y
longClick(x, y)//长按

 

5、虚拟按键

//______________________按键模拟_物理按键的全局函数_______________________________________________
//设置无障碍模式 fast为启用缓存
auto();

//以上函数都可以放在toast()或log()里, 例如:toast(notifications());
back();//返回,返回是否执行成功
home();//回到桌面,返回是否执行成功
powerDialog();//弹出电源键菜单。返回是否执行成功
notifications();//拉出通知栏。返回是否执行成功
quickSettings();//下拉通知栏到底。返回是否执行成功
recents();//显示最近任务。返回是否执行成功
splitScreen();//分屏

KeyCode(code); //模拟物理按键,需要参考KeyCode对照表( https://blog.csdn.net/yaoyaozaiye/article/details/122826340 )

 

 6、文件相关

//================================文件相关=====================================
log(files.exists("/sdcard/test.txt"));//返回文件是否存在

log(files.isDir("/sdcard/test.txt")); //返回路径path是否为目录

console.log(files.isFile("/sdcard/test.txt")); //返回路径path是否为文件

console.log("文件夹是否为空:",files.isEmptyDir("/sdcard/zhihu"));//返回文件夹path是否为空文件夹。如果该路径并非文件夹,则直接返回false

log("目录连接或文件",files.join("/sdcard/", "1.txt")); //连接两个路径并返回

log(files.create("/sdcard/test1111.txt")); //创建一个文件或文件夹并返回是否创建成功。如果文件已经存在,则直接返回false。

log(files.ensureDir("/sdcard/zhihu"));//确保路径path所在的文件夹存在。如果该路径所在文件夹不存在,则创建该文件夹。

files.copy("/sdcard/1.txt", "/sdcard/Download/1.txt");//复制文件,返回是否复制成功

files.move("/sdcard/1.txt", "/sdcard/Download/1.txt");//移动文件,返回是否移动成功。

log(files.getName("/sdcard/1.txt"));//返回文件的文件名(如1.txt),不包含路径

log("返回文件名不含拓展名:",files.getNameWithoutExtension("/sdcard/test.txt"));//返回不含拓展名的文件的文件名

log("返回文件的拓展名:",files.getExtension("/sdcard/test.txt"));//返回文件的拓展名

log(files.remove("/sdcard/3.txt"));//删除文件或空文件夹,返回是否删除成功。

log("返回脚本的当前工作文件夹路径:",files.cwd());


////删除文件夹,如果文件夹不为空,则删除该文件夹的所有内容再删除该文件夹,返回是否全部删除成功
//log(files.removeDir(path))


//读取文本文件path的所有内容并返回。如果文件不存在,则抛出FileNotFoundException。
log(files.read("/sdcard/test.txt"));
log(files.read("/sdcard/test.txt",encoding = "utf-8"));//指定编码,默认为utf-8


//把内容写入文件
var text = "文件444内2222222222555555容111111111111111111111";
files.write("/sdcard/3.txt", text);////写入文件(若文件存在就追加,不存在则创建文件)
app.viewFile("/sdcard/3.txt");//用其他应用查看文件

 

 7、其他方法

//================================其他方法=====================================
waitForPackage("com.tencent.mm", 1000); //)//等待指定的应用出现,每秒钟检查一次
sleep(1000)//毫秒数
sleep(random(1000,5000)); //随机等待1到5秒
log("message")//打印日志
toast("message")//气泡提示
toastLog("message")//打印日志并气泡提示
console.show()//显示控制台日志
setClip("text")//设置剪贴板内容
exit()//立即停止脚本运行
random(min, max)//随机数

 

 8.授权截图并自动确认

// 创建线程,用于自动点击“允许”按钮
threads.start(function() {
    sleep(1000); // 等待1秒,确保权限框已经弹出
    var allowButton = classNameContains("Button").textContains("允许").findOne(2000); // 查找“允许”按钮
    if (allowButton) {
        allowButton.click(); // 点击“允许”按钮
        toast("已自动点击允许");
    } else {
        toast("未找到允许按钮,请手动点击");
    }
});

// 请求截图权限
if (!requestScreenCapture()) {
    toast("请求截图失败");
    exit();
}

// 继续执行脚本
toast("截图权限已开启,继续执行脚本");

 

 9、查询图片并点击图片坐标

"auto";
// 封装请求截图权限并自动点击“允许”按钮的函数
function requestScreenCaptureWithAutoClick() {
    // 创建线程,用于自动点击“允许”按钮
    threads.start(function() {
        sleep(1000); // 等待1秒,确保权限框已经弹出
        var allowButton = classNameContains("Button").textContains("允许").findOne(2000); // 查找“允许”按钮
        if (allowButton) {
            allowButton.click(); // 点击“允许”按钮
            log("已自动点击允许");
        } else {
            toast("未找到允许按钮,请手动点击");
        }
    });

    // 请求截图权限
    if (!requestScreenCapture()) {
        toast("请求截图失败");
        exit();
    }
    // 继续执行脚本
   log(">>>>截图权限已开启,继续执行>>>>");
   sleep(1000);
}


// 封装查找图片并点击的函数
function findAndClickImage(imagePath,threshold) {
    // 加载目标图片
    var targetImage = images.read(imagePath);
    if (!targetImage) {
        toast("目标图片加载失败,请检查路径");
        exit();
    }

    // 截取当前屏幕
    var screenshot = captureScreen();

    //当阀值没传时、默认取0.8
    if (threshold === undefined) {
        threshold = 0.8; // 默认值
    }
    // 查找目标图片
    log("图片阀值:",threshold);
    var point = images.findImage(screenshot, targetImage, {
        threshold: threshold // 设置匹配精度,根据实际情况调整
    });

    if (point) {
        // 获取目标图片的中心坐标
        var x = point.x + targetImage.width / 2;
        var y = point.y + targetImage.height / 2;

        // 点击目标图片的中心
        click(x, y);
        toast("点击成功,坐标为 (" + x + ", " + y + ")");
    } else {
        toast("未找到目标图片");
    }

    // 释放图片资源
    targetImage.recycle();
    screenshot.recycle();
}


// 主函数
function main() {
    //// 请求截图权限并自动点击“允许”
    requestScreenCaptureWithAutoClick();

    //// 查找并点击目标图片(图片太小好像不行)
    findAndClickImage("/sdcard/Pictures/Screenshots/test005.jpg",0.7);
}

// 执行主函数
main();

 

 10、图片查询坐标&判断当前页包含xx图片&小案例

"auto";
// 封装请求截图权限并自动点击“允许”按钮的函数
function requestScreenCaptureWithAutoClick() {
    // 创建线程,用于自动点击“允许”按钮
    threads.start(function() {
        sleep(1000); // 等待1秒,确保权限框已经弹出
        var allowButton = classNameContains("Button").textContains("允许").findOne(2000); // 查找“允许”按钮
        if (allowButton) {
            allowButton.click(); // 点击“允许”按钮
            log("已自动点击允许");
        } else {
            toast("未找到允许按钮,请手动点击");
        }
    });

    // 请求截图权限
    if (!requestScreenCapture()) {
        toast("请求截图失败");
        exit();
    }
//     // 继续执行脚本
//    log(">>>>截图权限已开启,继续执行>>>>");
//    sleep(1000);
}


// 封装查找图片并点击的函数
function findAndClickImage(imagePath,threshold) {
    sleep(1000);
    // 加载目标图片
    var targetImage = images.read(imagePath);
    if (!targetImage) {
        toast("目标图片加载失败,请检查路径");
        exit();
    }

    // 截取当前屏幕
    var screenshot = captureScreen();

    //当阀值没传时、默认取0.8
    if (threshold === undefined) {
        threshold = 0.8; // 默认值
    }
    // 查找目标图片
    log("图片阀值:",threshold);
    var point = images.findImage(screenshot, targetImage, {
        threshold: threshold // 设置匹配精度,根据实际情况调整
    });
 
    if (point) {
        // 获取目标图片的中心坐标
        var x = point.x + targetImage.width / 2;
        var y = point.y + targetImage.height / 2;

        // 点击目标图片的中心
        click(x, y);
        toast("点击成功,坐标为 (" + x + ", " + y + ")");
    } else {
        toast("未找到目标图片");
    }

    // 释放图片资源
    targetImage.recycle();
    screenshot.recycle();
}



// 封装查询图片并返回结果
function findImageOnScreen(imagePath, threshold) {
    sleep(1000);
    // 加载目标图片
    var targetImage = images.read(imagePath);
    if (!targetImage) {
        toast("目标图片加载失败,请检查路径");
        // return false; // 返回 false 表示未找到图片
    }

    // 截取当前屏幕
    var screenshot = captureScreen();

    //当阀值没传时、默认取0.8
    if (threshold === undefined) {
        threshold = 0.8; // 默认值
    }
    // 查找目标图片
    log("图片阀值:",threshold);
    var point = images.findImage(screenshot, targetImage, {
        threshold: threshold // 设置匹配精度,根据实际情况调整
    });
    
    // 释放图片资源
    targetImage.recycle();
    screenshot.recycle();

    // 判断是否找到图片
    if (point) {
        log("找到目标图片");
        // 释放图片资源
        return true; // 返回 true 表示找到图片
    } else {
        log("未找到目标图片");
        return false; // 返回 false 表示未找到图片
    }
}


// 常规函数(业务函数)
function regularContent() {
    toastLog('>>>>>>程序开始执行>>>>>'); //toast提示+log记录
    launch("com.tencent.mm");
    sleep(2000);
    //选择主微信
    click(360,1920);
    sleep(2000);
    findAndClickImage("/sdcard/Pictures/Screenshots/test005.jpg",0.7);
    sleep(1000);
    findAndClickImage("/sdcard/Pictures/Screenshots/test006.jpg",0.7);
    while(!click("扫一扫"));
    //判断指定元素
   
}


// 主函数
function main() {
    //// 请求截图权限并自动点击“允许”
    requestScreenCaptureWithAutoClick();
    //regularContent()

    //// 查找并点击目标图片(图片太小好像不行)
    //findAndClickImage("/sdcard/Pictures/Screenshots/test005.jpg",0.6);
    //// 查找当前页面是否包含xx图片
    log(findImageOnScreen("/sdcard/Pictures/Screenshots/test005.jpg",0.6));

}

// 执行主函数
main();

 

11、控件相关

auto();

//__________________________判断控件是否可见_____________________________
function element_click(button){
    if (button.isClickable()) {
        button.click();
        console.log('>>>>>>控件可见-点击成功>>>>>');
    } else {
        console.log('>>>>>>控件不可点击>>>>>');
        console.log('>>>>>>检查是否被其他控件遮挡>>>>>');
    }
}

//////调用函数(可用id、desc、text等)
// var element = desc("搜索").findOne(2000);
// element_click(element);



//_______________判断控件是否可以点击(可用id、text都行)_______________________
var button = id("3bc").findOne();
if (button.isVisible()) {
    console.log('>>>>>>控件可见>>>>>');
    if (button.isClickable()) {
        button.click();
        console.log('>>>>>>点击成功>>>>>');
    } else {
        console.log('>>>>>>控件不可点击>>>>>');
    }
} else {
    console.log('>>>>>>控件不可见>>>>>');
}



//______________________________判断控件状态相关___________________________
var btnClose = text("朋友").findOne(3000); // 查找控件,超时时间为 3000 毫秒

if (btnClose) {
    console.log('元素存在');

    // 检查控件是否可见
    if (btnClose.isVisible()) {
        console.log("按钮对用户可见");

        // 检查控件是否启用
        if (btnClose.isEnabled()) {
            console.log("按钮启用");

            // 检查控件是否可点击
            if (btnClose.isClickable()) {
                console.log("按钮可以被点击");
                btnClose.click(); // 执行点击操作
            } else {
                console.log("按钮不可点击");
            }
        } else {
            console.log("按钮未启用");
        }
    } else {
        console.log("按钮不可见");
        // 尝试滚动到控件位置
        if (btnClose.scrollIntoView()) {
            console.log("滚动到按钮位置成功");
            // 再次检查是否可见
            if (btnClose.isVisible()) {
                console.log("按钮现在可见");
                // 再次检查是否启用和可点击
                if (btnClose.isEnabled() && btnClose.isClickable()) {
                    console.log("按钮启用且可以被点击");
                    btnClose.click(); // 执行点击操作
                } else {
                    console.log("按钮不可点击或未启用");
                }
            } else {
                console.log("按钮仍然不可见");
            }
        } else {
            console.log("无法滚动到按钮位置");
        }
    }
} else {
    console.log('元素不存在');
}


//_____________________处理click()控件点击没反应________________________
function clickUiBounds(ui) {
    if (ui.exists()) { // 检查控件是否存在
        console.log('>>>>>>控件存在>>>>>');
        var a = ui.findOnce(); // 尝试获取控件实例
        if (a) { 
            console.log('>>>>>>成功获取到控件实例>>>>>');
            var b = a.bounds(); // 获取控件的边界信息
            if (b) { 
                console.log('>>>>>>控件边界信息有效-点击成功>>>>>');
                click(b.centerX(), b.centerY()); // 点击控件的中心位置
                return true; // 返回成功标志
            }
        }
    }
    return false; // 如果任何一步失败,返回失败标志
}

//////调用方式1(支持id、text、desc等)
var button = text("朋友");
clickUiBounds(button);
////调用方式2(支持id、text、desc等)
clickUiBounds(id("0qd"));


//________________处理click()控件点击没反应的方法2________________________
function click_tap(item){
    ////计算控件中心坐标、然后通过坐标点击
    click(item.bounds().centerX(),item.bounds().centerY())
}

//////调用方式(支持id、text、desc、textContains等)
var element = text("朋友").findOne(2000);
click_tap(element);


//_________________________在规定时间内找到元素__________________________
var btnClose = text("朋友").findOne(3000);//findOne(5)查找xx毫秒超时
if (btnClose){
    console.log('元素存在');
    click(btnClose.bounds().centerX(),btnClose.bounds().centerY());//计算控件中心坐标、然后通过坐标点击
    //btnClose.click();//使用控件对象点击
    
}
else{
    console.log('元素不存在');
}


//________________在规定时间内找到元素(把findOne封装到函数内)______________
function click_tap(selector, timeout = 2000) {
    // 使用 selector 查找控件
    var element = selector.findOne(timeout);
    if (element) {
        // 计算控件中心坐标、然后通过坐标点击
        click(element.bounds().centerX(), element.bounds().centerY());
        console.log("点击成功");
    } else {
        console.log("未找到匹配的控件");
    }
}

// 调用方式(支持 id、text、desc、textContains 等)
click_tap(text("朋友"), 2000);

 

 

 

 

相关链接:

https://blog.csdn.net/gengzeqing/article/details/130409432 ............................auto.js属性以及方法
https://blog.csdn.net/zz00008888/article/details/133642191 ...........................APP自动化工具介绍
https://blog.csdn.net/sixpp/article/details/147662021.......................................Auto.js变成基础知识
http://www.feiyunjs.com/2456.html...................................................................Auto.js和EasyClick

posted on 2024-12-05 11:40  chen_2987  阅读(67)  评论(0)    收藏  举报

导航