请选择 进入手机版 | 继续访问电脑版
切换皮肤
最近用雷电模拟器做脚本,感觉这个模拟器还是非常强大的。结合python,写一些脚本,无往而不利,特来与大家分享一下自己的所得
注意的知识点:
1雷电模拟器有一个共享文件夹,pc上的文件夹和Android上的sdcard路径是相通的一个
共有三个文件夹图片杂项应用
在pc复制文件到这些文件夹,里面模拟器会立刻出现这些文件
反过来,在模拟器有这些文件,电脑上也会立刻出现,比亚洲开发银行的推动和拉动效率高很多,稳定性也强!
2尽量不要使用adb命令,因为要连续运行脚本的时候,adb容易复位,在有多个模拟器的时候,中断概率更高
3 dnconsole一般用于模拟器配置,启动和检测,而ld用于执行Android命令
4雷电模拟器如果卡,一是增加cpu和内存数量,二是看看是否能够负载,不行就降低分辨率,三是看看是否某些adb命令影响了
5雷电模拟器的应用,在多开的时候,偶尔会出现刚开机的时候连不上网络,一般等2或者分钟应用重启恢复即可
代码需要的安装蟒库有:枕[Python的] [color=rgb(51, 102, 153) !important]纯字幕:查看 [color=rgb(51, 102, 153) !important]复制代码
[color=rgb(51, 102, 153) !important]
  1. class Dnconsole:
  2.     # 请根据自己电脑配置
  3.     console = 'D:\\Changzhi\\dnplayer2\\dnconsole.exe '
  4.     ld = 'D:\\Changzhi\\dnplayer2\\ld.exe '
  5.     share_path = 'F:/share/Pictures'
  6. #获取模拟器列表
  7.     @staticmethod
  8.     def get_list():
  9.         cmd = os.popen(Dnconsole.console + 'list2')
  10.         text = cmd.read()
  11.         cmd.close()
  12.         info = text.split('\n')
  13.         result = list()
  14.         for line in info:
  15.             if len(line) > 1:
  16.                 dnplayer = line.split(',')
  17.                 result.append(DnPlayer(dnplayer))
  18.         return result
  19. #获取正在运行的模拟器列表
  20.     @staticmethod
  21.     def list_running() -> list:
  22.         result = list()
  23.         all = Dnconsole.get_list()
  24.         for dn in all:
  25.             if dn.is_running() is True:
  26.                 result.append(dn)
  27.         return result
  28. #检测指定序号的模拟器是否正在运行
  29.     @staticmethod
  30.     def is_running(index: int) -> bool:
  31.         all = Dnconsole.get_list()
  32.         if index >= len(all):
  33.             raise IndexError('%d is not exist' % index)
  34.         return all[index].is_running()
  35. #执行shell命令
  36.     @staticmethod
  37.     def dnld(index: int, command: str, silence: bool = True):
  38.         cmd = Dnconsole.ld + '-s %d %s' % (index, command)
  39.         if silence:
  40.             os.system(cmd)
  41.             return ''
  42.         process = os.popen(cmd)
  43.         result = process.read()
  44.         process.close()
  45.         return result
  46. #执行adb命令,不建议使用,容易失控
  47.     @staticmethod
  48.     def adb(index: int, command: str, silence: bool = False) -> str:
  49.         cmd = Dnconsole.console + 'adb --index %d --command "%s"' % (index, command)
  50.         if silence:
  51.             os.system(cmd)
  52.             return ''
  53.         process = os.popen(cmd)
  54.         result = process.read()
  55.         process.close()
  56.         return result
  57. #安装apk 指定模拟器必须已经启动
  58.     @staticmethod
  59.     def install(index: int, path: str):
  60.         shutil.copy(path, Dnconsole.share_path + str(index) + '/update.apk')
  61.         time.sleep(1)
  62.         Dnconsole.dnld(index, 'pm install /sdcard/Pictures/update.apk')
  63. #卸载apk 指定模拟器必须已经启动
  64.     @staticmethod
  65.     def uninstall(index: int, package: str):
  66.         cmd = Dnconsole.console + 'uninstallapp --index %d --packagename %s' % (index, package)
  67.         process = os.popen(cmd)
  68.         result = process.read()
  69.         process.close()
  70.         return result
  71. #启动App  指定模拟器必须已经启动
  72.     @staticmethod
  73.     def invokeapp(index: int, package: str):
  74.         cmd = Dnconsole.console + 'runapp --index %d --packagename %s' % (index, package)
  75.         process = os.popen(cmd)
  76.         result = process.read()
  77.         process.close()
  78.         print(result)
  79.         return result
  80. #停止App  指定模拟器必须已经启动
  81.     @staticmethod
  82.     def stopapp(index: int, package: str):
  83.         cmd = Dnconsole.console + 'killapp --index %d --packagename %s' % (index, package)
  84.         process = os.popen(cmd)
  85.         result = process.read()
  86.         process.close()
  87.         return result
  88. #输入文字
  89.     @staticmethod
  90.     def input_text(index: int, text: str):
  91.         cmd = Dnconsole.console + 'action --index %d --key call.input --value %s' % (index, text)
  92.         process = os.popen(cmd)
  93.         result = process.read()
  94.         process.close()
  95.         return result
  96. #获取安装包列表
  97.     @staticmethod
  98.     def get_package_list(index: int) -> list:
  99.         result = list()
  100.         text = Dnconsole.dnld(index, 'pm list packages')
  101.         info = text.split('\n')
  102.         for i in info:
  103.             if len(i) > 1:
  104.                 result.append(i[8:])
  105.         return result
  106. #检测是否安装指定的应用
  107.     @staticmethod
  108.     def has_install(index: int, package: str):
  109.         if Dnconsole.is_running(index) is False:
  110.             return False
  111.         return package in Dnconsole.get_package_list(index)
  112. #启动模拟器
  113.     @staticmethod
  114.     def launch(index: int):
  115.         cmd = Dnconsole.console + 'launch --index ' + str(index)
  116.         process = os.popen(cmd)
  117.         result = process.read()
  118.         process.close()
  119.         return result
  120. #关闭模拟器
  121.     @staticmethod
  122.     def quit(index: int):
  123.         cmd = Dnconsole.console + 'quit --index ' + str(index)
  124.         process = os.popen(cmd)
  125.         result = process.read()
  126.         process.close()
  127.         return result
  128.     # 设置屏幕分辨率为1080×1920 下次启动时生效
  129.     @staticmethod
  130.     def set_screen_size(index: int):
  131.         cmd = Dnconsole.console + 'modify --index %d --resolution 1080,1920,480' % index
  132.         process = os.popen(cmd)
  133.         result = process.read()
  134.         process.close()
  135.         return result
  136. #点击或者长按某点
  137.     @staticmethod
  138.     def touch(index: int, x: int, y: int, delay: int = 0):
  139.         if delay == 0:
  140.             Dnconsole.dnld(index, 'input tap %d %d' % (x, y))
  141.         else:
  142.             Dnconsole.dnld(index, 'input touch %d %d %d' % (x, y, delay))
  143. #滑动
  144.     @staticmethod
  145.     def swipe(index, coordinate_leftup: tuple, coordinate_rightdown: tuple, delay: int = 0):
  146.         x0 = coordinate_leftup[0]
  147.         y0 = coordinate_leftup[1]
  148.         x1 = coordinate_rightdown[0]
  149.         y1 = coordinate_rightdown[1]
  150.         if delay == 0:
  151.             Dnconsole.dnld(index, 'input swipe %d %d %d %d' % (x0, y0, x1, y1))
  152.         else:
  153.             Dnconsole.dnld(index, 'input swipe %d %d %d %d %d' % (x0, y0, x1, y1, delay))
  154. #复制模拟器,被复制的模拟器不能启动
  155.     @staticmethod
  156.     def copy(name: str, index: int = 0):
  157.         cmd = Dnconsole.console + 'copy --name %s --from %d' % (name, index)
  158.         process = os.popen(cmd)
  159.         result = process.read()
  160.         process.close()
  161.         return result
  162. #添加模拟器
  163.     @staticmethod
  164.     def add(name: str):
  165.         cmd = Dnconsole.console + 'add --name %s' % name
  166.         process = os.popen(cmd)
  167.         result = process.read()
  168.         process.close()
  169.         return result
  170. #设置自动旋转
  171.     @staticmethod
  172.     def auto_rate(index: int, auto_rate: bool = False):
  173.         rate = 1 if auto_rate else 0
  174.         cmd = Dnconsole.console + 'modify --index %d --autorotate %d' % (index, rate)
  175.         process = os.popen(cmd)
  176.         result = process.read()
  177.         process.close()
  178.         return result
  179. #改变设备信息 imei imsi simserial androidid mac值
  180.     @staticmethod
  181.     def change_device_data(index: int):
  182.         # 改变设备信息
  183.         cmd = Dnconsole.console + 'modify --index %d --imei auto --imsi auto --simserial auto --androidid auto --mac auto' % index
  184.         process = os.popen(cmd)
  185.         result = process.read()
  186.         process.close()
  187.         return result
  188. #改变CPU数量
  189.     @staticmethod
  190.     def change_cpu_count(index: int, number: int):
  191.         # 修改cpu数量
  192.         cmd = Dnconsole.console + 'modify --index %d --cpu %d' % (index, number)
  193.         process = os.popen(cmd)
  194.         result = process.read()
  195.         process.close()
  196.         return result
  197.     @staticmethod
  198.     def get_cur_activity_xml(index: int):
  199.         # 获取当前activity的xml信息
  200.         Dnconsole.dnld(index, 'uiautomator dump /sdcard/Pictures/activity.xml')
  201.         time.sleep(1)
  202.         f = open(Dnconsole.share_path + '/activity.xml' , 'r', encoding='utf-8')
  203.         result = f.read()
  204.         f.close()
  205.         return result
  206.     @staticmethod
  207.     def get_user_info(index: int) -> UserInfo:
  208.         xml = Dnconsole.get_cur_activity_xml(index)
  209.         usr = UserInfo(xml)
  210.         if 'id' not in usr.info:
  211.             return UserInfo()
  212.         return usr
  213. #获取当前activity名称
  214.     @staticmethod
  215.     def get_activity_name(index: int):
  216.         text = Dnconsole.dnld(index, '"dumpsys activity top | grep ACTIVITY"', False)
  217.         text = text.split(' ')
  218.         for i, s in enumerate(text):
  219.             if len(s) == 0:
  220.                 continue
  221.             if s == 'ACTIVITY':
  222.                 return text[i + 1]
  223.         return ''
  224. #等待某个activity出现
  225.     @staticmethod
  226.     def wait_activity(index: int, activity: str, timeout: int) -> bool:
  227.         for i in range(timeout):
  228.             if Dnconsole.get_activity_name(index) == activity:
  229.                 return True
  230.             time.sleep(1)
  231.         return False
  232. #找图
  233.     @staticmethod
  234.     def find_pic(screen: str, template: str, threshold: float):
  235.         try:
  236.             scr = cv.imread(screen)
  237.             tp = cv.imread(template)
  238.             result = cv.matchTemplate(scr, tp, cv.TM_SQDIFF_NORMED)
  239.         except cv.error:
  240.             print('文件错误:', screen, template)
  241.             time.sleep(1)
  242.             try:
  243.                 scr = cv.imread(screen)
  244.                 tp = cv.imread(template)
  245.                 result = cv.matchTemplate(scr, tp, cv.TM_SQDIFF_NORMED)
  246.             except cv.error:
  247.                 return False, None
  248.         min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
  249.         if min_val > threshold:
  250.             print(template, min_val, max_val, min_loc, max_loc)
  251.             return False, None
  252.         print(template, min_val, min_loc)
  253.         return True, min_loc
  254. #等待某个图片出现
  255.     @staticmethod
  256.     def wait_picture(index: int, timeout: int, template: str) -> bool:
  257.         count = 0
  258.         while count < timeout:
  259.             Dnconsole.dnld(index, 'screencap -p /sdcard/Pictures/apk_scr.png')
  260.             time.sleep(2)
  261.             ret, loc = Dnconsole.find_pic(Dnconsole.share_path + '/apk_scr.png' , template, 0.001)
  262.             if ret is False:
  263.                 print(loc)
  264.                 time.sleep(2)
  265.                 count += 2
  266.                 continue
  267.             print(loc)
  268.             return True
  269.         return False
  270.     # 在当前屏幕查看模板列表是否存在,是返回存在的模板,如果多个存在,返回找到的第一个模板
  271.     @staticmethod
  272.     def check_picture(index: int, templates: list):
  273.         Dnconsole.dnld(index, 'screencap -p /sdcard/Pictures/apk_scr.png')
  274.         time.sleep(1)
  275.         for i, t in enumerate(templates):
  276.             ret, loc = Dnconsole.find_pic(Dnconsole.share_path + '/apk_scr.png' , t, 0.001)
  277.             if ret is True:
  278.                 return i, loc
  279.         return -1, None
复制代码


[color=rgb(51, 102, 153) !important]



回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    Archiver|手机版|小黑屋|齐聚无忧 |网站地图

    Powered by Discuz! X3.4  © 2001-2013 Comsenz Inc.