首页 文章 精选 留言 我的

精选列表

搜索[异步方法],共10000篇文章
优秀的个人博客,低调大师

android实用测试方法之Monkey与MonkeyRunner

前言 本人比较懒,但是,研究如何让人变懒,却很积极…最新版的android SDK 4.0 ,monkey和monkeyRunner,变化很大…大到默认是运行失败的…囧,虽然,monkey和monkeyrunner目前有些不完善,但是,足以应付我们的使用需要.(最新的R15已经解决了这个问题更新真快…) Android UI 测试懒人第一:胡乱的按键,交给电脑搞定 有时候,我们要折腾一下程序,健壮不健壮,然后,找个上幼儿园的的弟弟/妹妹,把手机交给他/她,让他/她胡乱的按,看你的程序能不能接受这样的折腾,但是,我们身边不可能都有正太和萝莉,也不能保证他们拿到手机以后不是测试软件的健壮性,反而测试你的手机经不经摔,这与我们的期望差太远了…毕竟咱们是来软的不是来硬的… 当然,这世界牛人一把把的,然后,google公司考虑到我们的需要,把找个由某个牛人写的程序,集成到了比较新版本的SDK R8(即 android 2.2以后),然后,就有了下文 monkey 的使用 Monkey的智力就是一个三岁小孩的水平,所以,使用起来也是非常简单,当然,也做不了什么复杂的东西 adb shell monkey [options] <event-count> 详细的monkey介绍,和options的参数请查看 http://developer.android.com/guide/developing/tools/monkey.html 这里就不重复造轮子了… 实例: 我们验证程序在随机1000次事件中,能不能正常运行下去 adb shell monkey -p your.package.name -vvv 1000 > monkey1000.txt -v 为 verbose的缩写,就是详细输出事件等级,这个3个v就是输出等级1至3的所有事件,然后再使用管道命令将输出结果放到一个文本里面方便查看.接下来就是看你的程序能不能在这样的折腾下坚持下去了. 以上截个图看看吧 ------------------------------以下为折腾星人研究参考资料------------------------------ 然后,补充一下官方文档并没有更新的参数…不信你自己对照着来看,如果,你看到时候,官方更新了我说的这个,希望能回复我一下,让我更新一下… 主要多了两个参数: 这里我贴一个,国外有人用本地指定scriptfile成功的使用 I am trying to do 2 things with monkey 1. Execute a script with a command like adb shell monkey -p MY_PACKAGE --setup scriptfile -f /sdcard/ mon_script1.txt 1 where mon_script.txt contains a few touch commands. After I execute this, I see nothing happening on the screen. It even does not give me the "Number of events injected message". I have verified that my touch co-ordinates fall over actual UI elements. This is the script file I am using tap 79 29 tap 100 100 tap 200 200 tap 300 300 quit 2. Execute Monkey Network control to type commands individually. I start up monkey to listen to a port and use PuTTY to send commands. I get "OK" return messages, but nothing happens on the screen. Whenever I use monkey in the random mode, I see interaction on the screen. But I need to get one of the above 2 methods to work. I have seen the sources of monkey and nothing seems to be wrong. Has anyone used monkey in the above described way? If so, please tell me what I am doing wrong. 使用远程monkey 的代码模板 adb –e shell monkey -p your.pakagename --port 1080 & 然后重定向我们的模拟器端口 adb -e forward tcp 1080 tcp 1080 然后telnet 的我们的模拟器 telnet localhost 1080 接着telnet成功以后据说可以这样 tap 150 200 ----以上代码来源于Android application Test Guide 书中 然后,就可以看到我们控制UI事件了,可惜的是,我怎么测试都不能成功… 小结: 目前看来,monkey这个程序其实并不完善,有些功能连官方文档都还没更新,不过,作为折腾应用的使用还是足够的,看着自己的程序在模拟器中不断的被折磨…接下来要讲就是Monkey的进化--->MonkeyRunner MonkeyRunner 如果,把现阶段的monkey比做是幼儿园的小孩,那么monkeyrunner就是一个初中生了…它支持,自己编写插件,控制事件,随时截图,简而言之,任何你在模拟器/设备中能干的事情,MonkeyRunner都能干,而且还可以记录和回放!!! 具体介绍…看官方文档.这里还是不重复造轮子 http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html 注意:android sdk r14并没有把一个关键的jar包放lib目录中,所以,将无法运行,…然后请将SDK TOOLS 直接更新到最新的R15 下面提供一些常用的脚本,自己看着来改吧.. monkey_recorder.py monkey_placback.py help.py http://115.com/file/e6r0sln9# monkeyrunner_py脚本.rar 虽然,少了些东西,但是,并不影响我们大部分的需要.接下来用一段典型的monkeyRunner代码讲解! 注意!如果monkeyrunner脚本文件要使用中文,记得格式保存为utf8,不然会ASCNII(忘了怎么拼写了..)无法支持错误 #导入我们需要用到的包和类并且起别名 importsys fromcom.android.monkeyrunnerimportMonkeyRunnerasmr fromcom.android.monkeyrunnerimportMonkeyDeviceasmd fromcom.android.monkeyrunnerimportMonkeyImageasmi #connectdevice连接设备 #第一个参数为等待连接设备时间 #第二个参数为具体连接的设备 device=mr.waitForConnection(1.0,'emulator-5554') ifnotdevice: print>>sys.stderr,"fail" sys.exit(1) #定义要启动的Activity componentName='kg.monkey/.MonkeyActivity' #启动特定的Activity device.startActivity(component=componentName) mr.sleep(3.0) #dosometing进行我们的操作 #输入asd device.type('asd') #输入回车 device.press('KEYCODE_ENTER') #returnkeyboard点击返回用于取消等下看到截图的下方的白条 #device.press('KEYCODE_BACK') #------ #takeSnapshot截图 mr.sleep(3.0) result=device.takeSnapshot() #savetofile保存到文件 result.writeToFile('takeSnapshot\\result1.png','png'); 以上代码就是用monkeyrunner 实现操作特定操作以后,并且截图的功能,看上去貌似挺麻烦的…如果你有很多设备要一起测试,你就会发现以上代码是多么爽丫丫的事情.这个脚本的实质就是一个python脚本,懂点,python的朋友,可以利用这个实现非常强悍的功能.这里就打住了,各位想到什么好玩,实用的记得回复一下…大家一起交流. monkeyRunner 的记录和回放 前面讲的都是一些在命令行上的操作,我可记不住那么多的指令操作,我可不知道,我点击的这个点的坐标是多少,我多么希望,我能够在可视化界面里面讲我的操作记录下来,然后,直接重新播放,就像宏一样,我可以很高兴的告诉你,MonkeyRunner有这个功能实现起来也非常简单,我提供的打包文件中有一个,monkey_recorder.py,直接在命令行中打上: monkeyrunnermonkey_recorder.py 例如我们删掉我们刚才的asd字符串它就会记录下我们所有的操作!,就会看到如上截图!!! 接下来运行我们的保存的脚本,然后,你就看到模拟器,进行你刚才一样的操作 monkeyrunnermonkey_playback.pymonkey_test.mr 打开我们的文件可以看到其实就是一些monkeyrunner的一些脚本 TOUCH|{'x':329,'y':132,'type':'downAndUp',} TOUCH|{'x':100,'y':100,'type':'downAndUp',} TOUCH|{'x':296,'y':407,'type':'downAndUp',} TOUCH|{'x':296,'y':407,'type':'downAndUp',} TOUCH|{'x':296,'y':407,'type':'downAndUp',} TOUCH|{'x':296,'y':407,'type':'downAndUp',} TOUCH|{'x':351,'y':227,'type':'downAndUp',} 当然,有界面为什么不用呢~~~呵呵~ 补充一点:如果我们要进行多设备测试怎么办呢? 我们可以打开monkey_playback.py文件 importsysfromcom.android.monkeyrunnerimportMonkeyRunner #Theformatofthefileweareparsingisverycarfeullyconstructed. #Eachlinecorrespondstoasinglecommand.Thelineissplitinto2 #partswitha|character.Texttotheleftofthepipedenotes #whichcommandtorun.Thetexttotherightofthepipeisapython #dictionary(itcanbeevaledintoexistence)thatspecifiesthe #argumentsforthecommand.Inmostcases,thisdirectlymapstothe #keywordargumentdictionarythatcouldbepassedtotheunderlying #command. #Lookuptabletomapcommandstringstofunctionsthatimplementthat #command.CMD_MAP={'TOUCH':lambdadev,arg:dev.touch(**arg), 'DRAG':lambdadev,arg:dev.drag(**arg), 'PRESS':lambdadev,arg:dev.press(**arg), 'TYPE':lambdadev,arg:dev.type(**arg), 'WAIT':lambdadev,arg:MonkeyRunner.sleep(**arg)} #Processasinglefileforthespecifieddevice.defprocess_file(fp,device): forlineinfp:(cmd,rest)=line.split('|') try: #Parsethepydict rest=eval(rest) except: print'unabletoparseoptions'continue ifcmdnotinCMD_MAP: print'unknowncommand:'+cmdcontinue CMD_MAP[cmd](device,rest) defmain():file=sys.argv[1]fp=open(file,'r') #在这里指定你的设备吧 device=MonkeyRunner.waitForConnection()process_file(fp,device) fp.close(); if__name__=='__main__': main() 小结 至此,monkeyrunner的常用方式就这样完了,这里不打算说怎么编写一个自己的monkeyrunner插件,因为,我觉得我以上介绍的功能在实际开发中基本够用,而且,monkeyrunner估计,在下一个版本中会有一些更新,有兴趣的同学,自己查阅官方文档,当然,也可以联系本人… 本文转自 liam2199 博客,原文链接: http://blog.51cto.com/youxilua/772666如需转载请自行联系原作者

优秀的个人博客,低调大师

js之Date()方法获取时间问题

最近做的秒杀页面通过js切换时候发现ios上无效,在电脑模拟手机环境上正常。 最后发现: new Date('xxxx/xx/xx xx:xx:xx') 形式的时间对象在 IOS 和 Andriod 系统上都可以被正确的识别,而类似 new Date('xxxx-xx-xx xx:xx:xx') 形式的时间对象在 ios 系统上无法被正确的识别,需要做一层转化。 本文转自 水滴的历程 51CTO博客,原文链接:http://blog.51cto.com/12390959/2047427

优秀的个人博客,低调大师

在 docker 之间导出导入镜像的方法

pull不下来镜像。 可以通过 docker 提供把镜像导出export(保存save)为文件的机制,这样就可以把镜像copy到任意地方了。 1. 导出 export - 导入 import 格式:docker export CONTAINER(容器) 使用 docker ps -a 查看本机已有的容器,如: [root@docker1 LAMP]#docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dd43b6de6b33 weblogic:jdk1.6 "/run.sh" 3 days ago Up 3 days 0.0.0.0:32771->22/tcp, 0.0.0.0:32770->7001/tcp peaceful_saha aca388afeddf sshd:centos "/run.sh" 4 days ago Up 4 days 0.0.0.0:32769->22/tcp grave_turing ...... [root@docker1 LAMP]#docker export dd43b6de6b33 >/home/weblogic:jdk1.6.tar [root@docker1 LAMP]# cd /home [root@docker1 home]# ls weblogic:jdk1.6.tar 导出完成后,就可以使用 import 导入了 [root@docker1 home]# docker import - /home/weblogic:jdk1.6.tar 2.保存save - 加载 load 格式:docker save IMAGE(镜像) 使用 docker images 查看本机已有的镜像(也可以使用 docker commit <CONTAIN-ID> <IMAGE-NAME>命令把一个正在运行的容器保存为镜像),如: [root@docker1 LAMP]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ...... docker.io/tutum/lamp latest 3d49e175ec00 22 months ago 426.9 MB ...... [root@docker1 LAMP]#docker save 3d49e175ec00 >lamp.tar [root@docker1 LAMP]# ls Dockerfile lamp.tar [root@docker1 LAMP]# sz lamp.tar rz Starting zmodem transfer. Press Ctrl+C to cancel. Transferring lamp.tar... 100% 430366 KB 14345 KB/sec 00:00:30 0 Errors 有点慢,稍微等待一下,没有任何warn信息就表示保存OK。3d49e175ec00是镜像ID 现在就可以在任何装 docker 的地方加载 刚保存的镜像了 [root@docker1 home]# docker load < /lamp/lamp.tar 3.导出 export 与 保存 save 的区别 (1).export导出的镜像文件大小 小于 save保存的镜像 (2).export 导出(import导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史,所以无法进行回滚操作(docker tag <LAYER ID> <IMAGE NAME>);而save保存(load加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。(查看方式:docker images --tree) 注:导入加载进来觉得不合适可以使用 docker rm 容器ID 、 docker rmi 镜像ID 来删掉。 移除所有的容器和镜像(大扫除): 代码如下: docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a) 本文转自 Mr_sheng 51CTO博客,原文链接:http://blog.51cto.com/sf1314/2056647

优秀的个人博客,低调大师

android adb端口被占用解决方法

1.输入adb devices命令 C:\Users\Nick>adb devices List of devices attached adb server version (31) doesn't match this client (39); killing... error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048) 可以看出5037端口被占用了 2. 查看端口被哪个暂用 C:\Users\Nick>netstat -ano | findstr "5037" TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 17276 TCP 127.0.0.1:5037 127.0.0.1:61023 TIME_WAIT 0 TCP 127.0.0.1:5037 127.0.0.1:61028 TIME_WAIT 0 TCP 127.0.0.1:5037 127.0.0.1:61033 TIME_WAIT 0 TCP 127.0.0.1:5037 127.0.0.1:61038 TIME_WAIT 0 在任务管理器中查看17276的端口被那个进程暂用。结束进程。 本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/p/7063268.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

APK安装错误和解决方法

1. 手机系统内存剩余空间不足,导致安装失败: 提示情形: a. 提示为“ADB_INSTALL_FAILED_INSUFFICIENT_STORAGE”,意为手机存储空间不足; b. 提示为“ADB_INSTALL_FAILED_DEXOPT”,意为因手机存储空间不足导致APK解码失败; c. 提示为“ADB_INSTALL_FAILED_DEVICE_NOSPACE”,意为因手机存储空间不足导致apk拷贝失败; d. 提示为“ADB_INSTALL_FAILED_DEVICE_COPY_FAILED”,意为文件拷贝失败; 解决方案: 请尝试卸载掉不需要的应用/游戏,使手机释放出更多的剩余空间。 或者将存放在手机内存里的某些应用程序(并不是所有的应用程序都可以移动)移动到SD卡中去,也同样可以释放出一些空间。 2. 手机与电脑连接失败,导致安装失败: 提示情形: a. 提示为“ADB_INSTALL_DEVICES_NOT_FOUND”,意为找不到设备; b. 提示为“ADB_INSTALL_FAILED_DEVICE_OFFLINE”,意为设备离线; 解决方案: 请重新插拔USB连线,或更换USB插口,尝试成功连接您的手机后再进行尝试安装APK。 3. 需要尝试卸载APK,进行重新安装,来解决安装失败问题: 提示情形: a. 提示为“ADB_INSTALL_FAILED_UPDATE_INCOMPATIBLE”,意为更新不完整,请重新卸载后再试; b. 提示为“ADB_INSTALL_FAILED_CONFLICTING_PROVIDER”,意为软件供应商冲突,有可能与手机冲突无法解决; c. 提示为“ADB_INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES”,意为文件认证不一致; d. 提示为“ADB_INSTALL_FAILED_ALREADY_EXISTS”,意为目标已经存在; e. 提示为“ADB_INSTALL_FAILED_INVALID_ZIP_FILE”,意为非法的zip文件; 解决方案: 请尝试卸载APK(如果原来手机上有),重新下载APK并安装。 4. 需要通过刷新手机Android系统,来解决安装失败问题: 提示情形: a. 提示为“ADB_INSTALL_FAILED_OLDER_SDK”,意为您的手机系统版本低于软件所需版本; 解决方案: 请尝试刷新手机Android系统,来解决安装失败问题。 友情提示:刷机有风险,需谨慎操作或在有经验的朋友帮助下操作。 5. 因软件安装权限,而导致安装失败: 提示情形: a. 提示为“ADB_INSTALL_PARSE_FAILED_NO_CERTIFICATES”,意为文件未通过认证; 本文转自屠夫章哥 51CTO博客,原文链接:http://blog.51cto.com/4259297/1741175,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android获取视频音频的时长的方法

android当中获取视频音频的时长,我列举了三种。 1:获取视频URI后获取cursor cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION)); 2:根据MediaPlayer获取: MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); mediaPlayer.getDuration(); 3:采用MediaMetadataRetriever的方式: public static String getRingDuring(String mUri){ String duration=null; android.media.MediaMetadataRetriever mmr = new android.media.MediaMetadataRetriever(); try { if (mUri != null) { HashMap<String, String> headers=null; if (headers == null) { headers = new HashMap<String, String>(); headers.put("User-Agent", "Mozilla/5.0 (Linux; U; Android 4.4.2; zh-CN; MW-KW-001 Build/JRO03C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/1.0.0.001 U4/0.8.0 Mobile Safari/533.1"); } mmr.setDataSource(mUri, headers); } duration = mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION); } catch (Exception ex) { } finally { mmr.release(); } LogUtil.e("ryan","duration "+duration); return duration; } 本文转自 一点点征服 博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/7233350.html,如需转载请自行联系原作者

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册