Android自动化AirScript

官网:http://airscript.cn/

一个基于Python编程、面向Android、Windows、iPhone等端的自动化脚本执行工具,可以使用在线Web页面进行调试开发,进阶地可以使用Pycharm或VSCode进行复杂脚本开发。拥有完善的py标准库和airscript动作库,可以嵌入js、java等语言进行开发,支持yolo图像训练融合,支持在线检索页面结构生成代码,支持项目脚本多端同步等功能。

一、运行环境

  1. 安装Python

    python官网:https://www.python.org/downloads/

    建议下载 3.8.10版本

  2. 安装PyCharm

    pycharm官网:https://www.jetbrains.com/pycharm/download/

    建议下载最新的社区版本

  3. 安装AirScript插件

    插件分享:https://pan.baidu.com/s/1UGM6ucM_Wn7X4RiAQm7q9g?pwd=pggv

    插件安装:打开pycharm,左上角进设置,点插件,从本地磁盘安装,选择zip文件(不要解压)

  4. 手机安装执行器APP

    下载地址:http://airscript.cn/

    手机进入点击下载。或电脑打开,手机扫码下载。

    下载完成后,进入APP,授予无障碍权限,其他权限确认允许。

二、新建项目

安装好插件后重启pycharm,左上角文件-AirScript-新建项目,按表单填写

三、设备连接

新窗口打开刚才新建的项目,左上角文件-AirScript-设备管理-添加设备

设备名称随意,设备地址在手机APP-开发者,设备端口默认9096

四、运行demo

需要保证手机和电脑网络处在同于局域网

  1. 可以pycharm运行

  2. 也可以网页,电脑浏览器打开,IP:端口,在IDEA中编辑运行

  3. 代码确定后,在手机端点击项目执行

  4. 附demo

python 复制代码
import time
from airscript.action import touch
# 启动
from airscript.node import Selector
from airscript.system import Media
from airscript.system import R
# 开始吧
from airscript.ui.dialog import toast
 
 
# class listener:
#     def prepare(self,player):
#         # 获取音频时长
#         dur = player.getDuration()
#         # 带监听器,我们需要调用start方法
#         player.start()
#     def completion(self):
#         print('播放完毕')
 
# Media.play(R(__file__).res('/media/letsgo.mp3'),listener())
 
time.sleep(1)
def open_viewer_list(open_num):
    # 观众列表
    while not Selector().id('com.tencent.qqmusic:id/mlive_top_guest_num').visible(True).find():
        pass
    Selector().id('com.tencent.qqmusic:id/mlive_top_guest_num').click().find()
    # 真爱粉丝
    while not Selector().text('真爱粉丝').depth(12).visible(True).find():
        pass
    Selector().text('真爱粉丝').depth(12).click().find()
    time.sleep(1)
    if open_num > 5:
        # 加载榜单 - 日榜
        toast('加载全部粉丝中', 500)
        n = 6
        while n:
            while not Selector().id('js_scroll_container').type('View').visible(True).find():
                pass
            Selector().id('js_scroll_container').type('View').click().slide(10).find()
            n -= 1
        Selector().id('js_scroll_container').type('View').click().slide(-100).find()
        toast('加载完成', 1000)
 
 
def slip_viewer_list(cnt):
    while cnt > 0:
        touch.down(640, 1930)
        touch.move(640, 1749, 200)
        touch.up(640, 1749)
        time.sleep(0.1)
        cnt -= 1
 
# # 启动APP
# Intent.run('com.tencent.qqmusic')
# time.sleep(2)
# 位置判断
if not Selector().id('com.tencent.qqmusic:id/jy_').visible(True).find() and not Selector().id(
        'com.tencent.qqmusic:id/mlive_view_pager').visible(True).find():
    toast('先回到首页', 2000)
    # # 进直播TAB
    # while not Selector().id('com.tencent.qqmusic:id/jy_').desc('直播').visible(True).find():
    #     pass
    # Selector().id('com.tencent.qqmusic:id/jy_').desc('直播').click().find()
    # 等待选厅
if Selector().id('com.tencent.qqmusic:id/jy_').desc('直播').visible(True).find():
    toast('开始选厅', 3000)
 
time.sleep(0.5)
# 打开日榜列表
open_viewer_list(6)
# 获取头像view列表 长度
while not Selector().id('js_scroll_container').child(2).child(1).child().find():
    pass
fav_selector_len = 0
if Selector().id('js_scroll_container').child(2).child(1).child().find_all()[0].childCount>0:
    fav_selector_len = len(Selector().id('js_scroll_container').child(2).child(1).child().find_all())
# 私信个数
do_work_cnt = 0
while do_work_cnt < fav_selector_len:
    time.sleep(1)
    # 点击头像
    Selector().id('js_scroll_container').child(2).child(1).child().find_all()[do_work_cnt].child(2).click()
    # 点击私信
    while not Selector().id('com.tencent.qqmusic:id/mlive_info_card_neutral_layout').find():
        pass
    Selector().id('com.tencent.qqmusic:id/mlive_info_card_neutral_layout').click().find()
 
    # 输入
    while not Selector().id('com.tencent.qqmusic:id/dsy').desc('消息').find():
        pass
    time.sleep(1)
    Selector().id('com.tencent.qqmusic:id/dsy').desc('消息').input('xxxx').find()
    # 发送
    while not Selector().id('com.tencent.qqmusic:id/dub').text('发送').find():
        pass
    Selector().id('com.tencent.qqmusic:id/dub').text('发送').click().find()
    toast(
        f'已发{str(do_work_cnt + 1)}/{str(fav_selector_len)}->' + Selector().id('com.tencent.qqmusic:id/dv0').type(
            'TextView').find().text, 1000)
    time.sleep(1)
    # 返回语音厅next
    Selector().id('com.tencent.qqmusic:id/dt4').depth(5).click().find()
    open_viewer_list(do_work_cnt + 1)
    slip_viewer_list(do_work_cnt - 3)
    do_work_cnt += 1
相关推荐
来一颗砂糖橘24 分钟前
负载均衡的多维深度解析
运维·负载均衡
楠奕30 分钟前
CentOS7安装GoldenDB单机搭建及常见报错解决方案
linux·运维·服务器
恋猫de小郭41 分钟前
Android 上为什么主题字体对 Flutter 不生效,对 Compose 生效?Flutter 中文字体问题修复
android·前端·flutter
三少爷的鞋44 分钟前
不要让调用方承担你本该承担的复杂度 —— Android Data 层设计原则
android
李李李勃谦1 小时前
Flutter 框架跨平台鸿蒙开发 - 创意灵感收集
android·flutter·harmonyos
GCTTTTTT1 小时前
远程服务器走本地代理
运维·服务器
剑锋所指,所向披靡!1 小时前
Linux常用指令(2)
linux·运维·服务器
飞Link1 小时前
逆向兼容的桥梁:3to2 自动化降级工具实现全解析
运维·开发语言·python·自动化
fengci.2 小时前
ctfshow其他(web396-web407)
android
LIZhang20162 小时前
linux写一个脚本实时保存内存占用情况
linux·运维·服务器