Android_自动化测试

上传人:小** 文档编号:44953807 上传时间:2021-12-06 格式:DOC 页数:42 大小:431KB
收藏 版权申诉 举报 下载
Android_自动化测试_第1页
第1页 / 共42页
Android_自动化测试_第2页
第2页 / 共42页
Android_自动化测试_第3页
第3页 / 共42页
资源描述:

《Android_自动化测试》由会员分享,可在线阅读,更多相关《Android_自动化测试(42页珍藏版)》请在装配图网上搜索。

1、Android 自动化测试初探-1: 捕获 Activity 上的 Element第一部分:前言Android 系统下应用程序的测试现在应该还算是个新的领域,网上关于这方面的资料很多都是基于白盒测试的, 一般都是基于 JUnit框架和 An droid SDK中an droid.test等命名空间下的 内容进行, 但是有一个前提, 那就是必须要有应用程序的源代码以提供测试接入点, 但是这 在很多软件公司中是 不现实的。很多测试工程师做的工作是完全黑盒,基本接触不到源代 码,白盒测试大部分也是由开发自己完成。回顾一下 Windows 下的黑盒测试自动化,先前使用的是微软提供的基于 .net fr

2、amework 的 UI Automation 自动化测试框架 (要求版本在 .net framework 3.0 以上,即 VS.NET 2008开发环境),对与擅长C#语言的人来说,使用起来确认比较好用。本人也写了基于UIAutomation 的轻量级的自动化框架,将在以后的博文中引出。那在 Android 操作系统中能不能做类似于 UI Automation 的事情呢?不幸的是,Android 的权限控制分的非常清楚,不同程序之间的数据访问只能通过Intent, contentprovider 类似的功能实现。也就是说你开发的运行在 Android 中的自动化程序想要捕获当前 运行的 A

3、UT(Application under Test)界面上的控件等 Element (该术语引自 UI Automation , 觉得翻译成元素有点生硬,故不作翻译)基本不可能,你也拿不到当前active activity 的引用(截止本文发帖为止,个人暂时没有找到办法获得此引用)。无路可走了?模拟器里面不能走,外面能不能走?或许可以。第二部分:捕获 Activity 上的 Element在An droid的SDK中自带了一个对自动化测试比较有用的工具:hierarchyviewer (位于SDK的tools目录下)。在模拟器运行的情况下,使用该工具可以将当前的 Activity上的Eleme

4、nt 以对象树的形式展现出来,每个 Element 所含的属性也能一一尽显。这有点像 Windows上运行的UI SPY唯一遗憾的是不支持事件的触发。不过没有关系,可以想办法绕,当务之急是能在自行编写的自动化测试代码里找到 Activity 上的 Element。第一个想到的办法就是看 hierarchyviewer 源码,不巧,网上搜了一下,没有资源。 或许Google的官网上有,但是上不去。看来只能反编译了,找来XJad,暴力之。虽然反编译出来的代码很多地方提示缺少 import ,但代码基本上是正确的。 看了一下, 确实也知道了 许多。后来在编写代码的过 程中,确实也证明了如果想引用 h

5、ierarchyviewer.jar 这个包并调 试,还是需要知道里面的一些设置的。创建基于hierarchyviewer.jar这个包的调用,需要将它和另外两个包,ddmlib.jar (在 hierarchyviewer.jar 同级目录中有) 和 org-netbeans-api-visual.jar (需要下载并安装 netbeans, 在其安装目录中有) 一并导入到工程项目中,因为 hierarchyviewer 的实现依附于这两个包。想在代码中获取 Activity 上的 Element 需要进行如下几个步骤(如果使用过 hierarchyviewer 这个工具后会发现,自动化代码

6、所要写的就是该工具上的使用步骤):1.Ensure adb running2. Set adb location (因为 hierarchyviewer 和模拟器的沟通完全是依靠 adb 做的,所以设 定正确的 adb 程序的位置至关重要,本人就曾在这个问题上栽了半天多)3. Get Active Device (这个等同动作发生在启动hierarchyviewer 工具时 )4. Start View Server (等同于工具上 Start Server 菜单触发事件 )5. Load Scene (等同于工具上 Load View Hierarchy 菜单触发事件 )6. Get Roo

7、t View Node (获得对象树的根节点, 这个动作在工具上点击 Load View Hierarchy菜单后会自动加载 )7. Get Sub View Node (获得想要查找的 View Node ,这个动作在工具上点击Load ViewHierarchy 菜单后会自动加载 )说明:上述步骤中一些名称实际上就是 hierarchyviewer 中所提供的可访问方法名称,如 startViewServer 、 loadScene、 rootNode 等。另外 View Node 实际上 hierarchyviewer 中的一 个类,表示的对象树上的一个Element 。现将部分核心代码

8、粘贴如下:1. Set adb locationAndroidandroid-sdk-windowstools);其中 ” hierarchyviewer.adb 这”个 key 是 hierarchyviewer.jar 中指定的,后面的 value 是存放An droid SDK的路径。这个目录必须是当前运行的模拟器所对应的adb的目录,不能自行使用其他目录下adb,否则会发生adb进程异常退出的错误。2. Get Active DeviceIDevice devices = null;DeviceBridge.terminate();while(null=devices | 0=devi

9、ces.length)DeviceBridge.initDebugBridge() ;/it must wait for some time, otherwise will throw exception try Thread.sleep(1000); catch (InterruptedException e) e.printStackTrace();devices = DeviceBridge.getDevices() ;return devices;以上方法返回的是所有当前运行的Device 列表3. Start View ServerDeviceBridge.startViewServ

10、er(device);4. Load SceneViewHierarchyLoader.loadScene(device,Window.FOCUSED_WINDOW);5. Get Root View Nodevhs.getRoot() ;其中 vhs 是 ViewHierarchyScene 的实例对象6. Get Sub View Nodepublic ViewNode findFirstChildrenElement(IDevice device, ViewNode entryViewNode, String elementID)ViewNode node=null;if(0!=entr

11、yViewNode.children.size()for(int i=0;i DUMP);out.write(new StringBuilder().append(DUMP -1).toString();out.newLine();out.flush();doString line;if (line = in.readLine() = null | DONE.equalsIgnoreCase(line)break;line = line.trim();System.out.println(line); while (true); catch (IOException e) e.printSta

12、ckTrace();运行后的结果摘录其中一部分( button5 ),列举如下。注:当前 device 中运行的是 2.1SDK 中自带的 Calculator 程序:com.android.calculator2.ColorButton43b8bee8 mText=1,5 getEllipsize()=4,null mMinWidth=1,0 mMinHeight=1,0 mMeasuredWidth=2,79 mPaddingBottom=1,0 mPaddingLeft=1,0 mPaddingRight=1,0 mPaddingTop=1,0 mMeasuredHeight=2,78

13、mLeft=2,81 mPrivateFlags_DRAWING_CACHE_INVALID=3,0xm0 PrivateFlags_DRAWN=4,0x20 mPrivateFlags=8,16779312 mID=9,id/digit5 mRight=3,160 mScrollX=1,0 mScrollY=1,0 mTop=1,0 mBottom=2,78 mUserPaddingBottom=1,0 mUserPaddingRight=1,0 mViewFlags=9,402669569 getBaseline()=2,54 getHeight()=2,78 layout_gravity

14、=4,NONE layout_weight=3,1.0 layout_bottomMargin=1,0 layout_leftMargin=1,1 layout_rightMargin=1,0 layout_topMargin=1,0 layout_height=11,FILL_PARENTlayout_width=11,FILL_PARENTgetTag()=4,null getVisibility()=7,VISIBLEgetWidth()=2,79 hasFocus()=5,false isClickable()=4,true isDrawingCacheEnabled()=5,fals

15、e isEnabled()=4,true isFocusable()=4,true isFocusableInTouchMode()=5,false isFocused()=5,false isHapticFeedbackEnabled()=4,true isInTouchMode()=4,true isOpaque()=5,false isSelected()=5,false isSoundEffectsEnabled()=4,true willNotCacheDrawing()=5,false willNotDraw()=5,false另外还支持如下命令:- LISTwill show t

16、he list of windows:LIST43514758 com.android.launcher/com.android.launcher.Launcher4359e4d0 TrackingView435b00a0 StatusBarExpanded43463710 StatusBar43484c58 KeyguardDONE.Android 自动化测试初探-3:架构实现前两节讲了用 An droid SDK 自带的 tool-hierarchyviewer 来捕获 Activity 上 Eleme nt,并分析了 其中的原理。对于要实现GUI自动化,还有哪些工作没有完成呢? n In

17、voke界面上的Element,如点击按钮,在文本框中输入内容等nPress手机自身所有的按键,如HOME键,Menu键,左右上下方向键,通话键,挂机键n 判断测试结果前面说过,直接从 Emulator 内部获取当前 Activity 上的 Element 这条路已经断了,同理,探 索像 UI Automation 上一样 Invoke Element 的操作估计是行不通了,因为你拿不到 Element 的对象实例,所以实例所支持的方法当然也没有办法拿到。怎么办?实在不行,基于坐标来对 Element 进行触发总可以吧。在 Windows 中发送基于坐 标发送键盘和鼠标事件一般是在无法识别 E

18、lement 的情况下,想的最后一招,这使我想起 起了 Android 中的 monkey 测试,对着屏幕就是一通乱点,压根就不管点的是什么。所幸的 是,当 前 Android 系统中我们得到了 Element 的属性信息,其中就包括坐标信息,而且这 种信息是具有弹性的,也就是说即使 Element 的坐标随着开发 的改变而有所变化,也不用 担心,因为当前的坐标是实时获得的。那么怎样才能给 Element 发送模拟按键等操作呢?总不能用 Windows 当前的键盘和鼠标事 件吧,那样一旦模拟器的位置改变或失去焦点,啥都白搭,风险太大了。看来给 Emulator内部发送模拟按键等操作比较靠谱。查

19、了一下SDK其中确实有这样的方法存在,但是我们当前的测试基础架构程序位 于 Emulator 外部,怎么办?突然想起了 hierarchyviewer 的实现 机制,通过 Socket 来发送信息。 Hierarchyviewer 有 系统自带的进程给予答复响应(具体是 哪个进程进行的响应不清楚,没有研究过) 。那么我们也来模拟做一个 Listener 总可以吧。其实对于模拟按键发送,网上的帖子很多,但大部分是基于一种方式实现的,IWin dowMa nager接口。不巧的是,SDK并没有将该接口提供为public,所以需要用an droid源码替代 android.jar 包进行编译的方式进

20、行绕行, 感觉方法有点复杂。 在后面另一篇系列文 章中我会列出我 在网上看到的另一种基于 Instrumentation 和 MessageQueue 的机制实现方 法。最后就剩下判断测试结果了。 判断测试结果一般分为如下两种: 外部条件是否满足, 如文件 是否产生,数据是否生成等; 内部条件是否满足, 如对应的 Element 是否出现或消失, Element 上内容如字符串是否有变化。对于前一种本文不予讨论,后一种情况下,Element 出现或消失可以通过 hierarchyviewer 来获取。仔细研究过 hierarchyviewer 会发现,它并没有提供Element界面上内容(Te

21、xt)的属性。这 可有点晕了,好像又要回到实现捕获Activity实例的老路上来了。考虑图像识别?这好像不靠谱。突然想到,4939端口上发送DUMP命令后的返回结 果中会不会有此类 hierarchyviewer 没有显示出来的信息呢,万幸,还真有。在我 上一篇博文(Hierarchyviewer捕获Element的实现原理)中查询mText字段,会发现mText=1,5 这样的信息, 其实就是代表了计算器 Button5 上显示的内容 5,逗号前 的 1 表示后跟一位信 息。至此,问题似乎都解决掉了。画个基础架构图做个总结:Android自动化测试初探-4:模拟键盘鼠标事件通过Socket

22、+ Instrumentation实现模拟键盘鼠标事件主要通过以下三个部分组成:I Socket编程:实现 PC和Emulator通讯,并进行循环监听I Service服务:将Socket的监听程序放在 Service中,从而达到后台运行的目的。这里要说明的是启动服务有两种方式,bindService和startService,两者的区别是,前者会使启动的Service随着启动Service的Activity的消亡而 消亡,而startService则不会这样,除非显式调 用stopService,否则一直会在后台运行因为Service需要通过一个 Activity来进行启动,所以采用star

23、tService更适合当前的情形l Instrumentation发送键盘鼠标事件:Instrumentation提供了丰富的以send开头的函数接 口来实现模拟键盘鼠标,如下所述:sendCharacterSync(int keyCode)/ 用于发送指定 KeyCode 的按键sendKeyDownUpSync(int key)/ 用于发送指定 KeyCode 的按键sen dPo in terS yn c(Moti on Eve nt event) /用于模拟TouchsendStringSync(String text)/ 用于发送字符串注意:以上函数必须通过Message的形式抛到

24、Message队列中。如果直接进行调用加会导致程序崩溃。对于Socket编程和Service网上有很多成功的范例,此文不再累述,下面着重介绍一下发送 键盘鼠标模拟事件的代码:1. 发送键盘KeyCode: 步骤1.声明类handler变量private static Handler handler;步骤 2. 循环处理 Message/ 在 Activity 的 onCreate 方法中对下列函数进行调用private void createMessageHandleThread()/need start a thread to raise looper, otherwise it will

25、be blockedThread t = new Thread() public void run() Log.i( TAG,Creating handler. );Looper.prepare();handler = new Handler()public void handleMessage(Message msg) /process incoming messages here;Looper.loop();Log.i( TAG,Looper thread ends );t.start();步骤 3. 在接收到 Socket 中的传递信息后抛出 Messagehandler.post( n

26、ew Runnable() public void run() Instrumentation inst=new Instrumentation();inst.sendKeyDownUpSync(keyCode); );2. Touch 指定坐标,如下例子即 touch point ( 240,400 )Instrumentation inst=new Instrumentation();inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEve

27、nt.ACTION_DOWN, 240, 400, 0);inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 240, 400, 0);3. 模拟滑动轨迹将上述方法中间添加 MotionEvent.ACTION_MOVEAndroid自动化测试初探(五):再述模拟键盘鼠标事件(adb shell实现)上一篇博文中讲述了通过 Socket 编程从外部向 Emulator 发送键盘鼠标模拟事件,貌似 实现细节有点复杂

28、。其实 Android 还有一种更简单的模拟键盘鼠标事件的方法,那就是通过 使用 adb shell 命令。1. 发送键盘事件:命令格式 1: adb shell input keyevent “value ”其中 value 以及对应的 key code 如下表所列:KeyEvent ValueKEYCODEComment0 KEYCODE_UNKNOWN1KEYCODE_MENU在SDK2.1的模拟器中命令失效,sendevent命令可行2KEYCODE_SOFT_RIGHT3KEYCODE_HOME4KEYCODE_BACK5KEYCODE_CALL6KEYCODE_ENDCALL7KE

29、YCODE_08KEYCODE_19KEYCODE_210KEYCODE_311KEYCODE_412KEYCODE_513KEYCODE_614KEYCODE_715KEYCODE_816KEYCODE_917KEYCODE_STAR18KEYCODE_POUND19KEYCODE_DPAD_UP20KEYCODE_DPAD_DOWN21KEYCODE_DPAD_LEFT22KEYCODE_DPAD_RIGHT23KEYCODE_DPAD_CENTER24KEYCODE_VOLUME_UP25KEYCODE_VOLUME_DOWN26KEYCODE_POWER27KEYCODE_CAMERA

30、28KEYCODE_CLEAR29KEYCODE_A30KEYCODE_B31KEYCODE_C32KEYCODE_D33KEYCODE_E34KEYCODE_F35KEYCODE_G36KEYCODE_H37KEYCODE_I38KEYCODE_J39KEYCODE_K40KEYCODE_L41KEYCODE_M42KEYCODE_N43KEYCODE_O44KEYCODE_P45KEYCODE_Q46KEYCODE_R47KEYCODE_S48KEYCODE_T49KEYCODE_U50KEYCODE_V51KEYCODE_W52KEYCODE_X53KEYCODE_Y54KEYCODE_

31、Z55KEYCODE_COMMA56KEYCODE_PERIOD57KEYCODE_ALT_LEFT58KEYCODE_ALT_RIGHT59KEYCODE_SHIFT_LEFT60KEYCODE_SHIFT_RIGHT61KEYCODE_TAB62KEYCODE_SPACE63KEYCODE_SYM64KEYCODE_EXPLORER65KEYCODE_ENVELOPE66KEYCODE_ENTER67KEYCODE_DEL68KEYCODE_GRAVE69KEYCODE_MINUS70KEYCODE_EQUALS71KEYCODE_LEFT_BRACKET72KEYCODE_RIGHT_B

32、RACKET73KEYCODE_BACKSLASH74KEYCODE_SEMICOLON75KEYCODE_APOSTROPHE76KEYCODE_SLASH77KEYCODE_AT78KEYCODE_NUM79KEYCODE_HEADSETHOOK80KEYCODE_FOCUS81KEYCODE_PLUS82KEYCODE_MENU83KEYCODE_NOTIFICATION84KEYCODE_SEARCH85TAG_LAST_KEYCODE命令格式 2 :adb shell sendevent device type code value如: adb shell sendevent /de

33、v/input/event0 1 229 1 代表按下按下 menu 键adb shell sendevent /dev/input/event0 1 229 0 代表按下松开 menu 键说明:上述的命令需组合使用另外所知道的命令如下:Key Name CODEMENU 229HOME 102BACK(back button) 158CALL(call button) 231END (end call button) 1072. 发送鼠标事件 (Touch):命令格式: adb shell sendevent device type code value情况 1 :在某坐标点上 touch如

34、在屏幕的 x 坐标为 40, y 坐标为 210 的点上 touch 一下,命令如下adb shell sendevent /dev/input/event0adb shell sendevent /dev/input/event030 4031 210adb shell sendevent /dev/input/event0adb shell sendevent /dev/input/event01 330 1 /touch00 0 /it must haveadb shell sendevent /dev/input/event0adb shell sendevent /dev/input

35、/event01 330 0 /untouch 00 0 /it must have以上六组命令必须配合使用,缺一不可情况 2 :模拟滑动轨迹(可下载并采用aPaint 软件进行试验)如下例是在 aPaint 软件上画出一条开始于( 100,200 ),止于( 108,200)的水平直线adb shell sendevent /dev/input/event0adb shell sendevent /dev/input/event030100 /start from point (100,200)31 200adb shell sendevent /dev/input/event0adb sh

36、ell sendevent /dev/input/event01 330 1 /touch000adb shell sendevent /dev/input/event0adb shell sendevent /dev/input/event03 0 101 /step to point (101,200)000/must list each step, here just skipadb shell sendevent /dev/input/event0adb shell sendevent /dev/input/event030108 /end point(108,200)000adb s

37、hell sendevent /dev/input/event0adb shell sendevent /dev/input/event01 330 0 /untouch000尝试 Android ScriptingEnvironment前言研究了一下 ASE( Android Scripting Environment: 这个很火的项目 ( /topic/407925 )目前还处于 Alpha Release 状态。它封装了一些 JavaAPI, 从而可以通过脚本 大提供开发效率。(Python,LUA 等)去访问 某些 JavaAPI, 从而大目前封装的 API 包括 拨号 / 短信 /w

38、ifi/bt/barcode , 等等,具体见: 首先从: 下载到最新版本的 ASE, 比如 ASE_r25.apk启动 Android 设备或者虚拟设备, 通过 adb install 将 ASE 安装到目标机上。 在目标机上运行 ASE, 首先通过 Menu-Add Interpreter 安装一种解释器,比如 Python. 安装完成后会自动下载相关脚本,并切换到脚本试图。 现在我们可以上下选择并运行某个脚本。修改代码下面我们尝试修改代码。 由于直接在目标机上编辑比较麻烦, 我们先在 PC 侧编辑好后再用 ADB shell 将其 push 到目标机上。从 Logcat 信息我们可以看到

39、 ASE 会下载脚本包:http:/android-并解压缩到: /sdcard/ase/scripts所以,我们:1) 使用 wget 下载相关脚本:wget http:/android-2) 解开这个包。修改代码:unzip python_scripts_r7.zipcp hello_world.py hello_world2.pyvi hello_world2.py修改一下打印语句,比如 droid.makeToast(Goodbye, Android!)3) 将这个修改的文件放到目标机上:adb push hello_world2.py /sdcard/ase/scripts4) 在目

40、标机上运行 ASE ,可以看到我们修改的脚本,并可以运行!通过 adb shell 执行脚本通过ASE执行 脚本比较慢,需要人工操作!我们尝试在 PC侧使用脚本通过 adb来直接运行!看 ASE 执行脚本的过程,似乎也只是调出了命令行,设置了一些环境变量,最终运行脚本。所以我们模仿它写了一个脚本, 如下脚本以待执行的 python 脚本为参数,将其通过 adb 放到 目标机上执行#!/bin/sh#=# By: zjujoe# YOUSHOULDINSTALLASEAND PYTHONINTERPRETERON TARGETFIRSTLY# I am using ase_r25.apk, fo

41、r other version, blow path may change# You should change AP_PORTwith the one from ASEconsole#start ASEsever first: # adb -s emulator-5554 shell am start -a com.google.ase.action.LAUNCH_SERVER# -n com.google.ase/.activity.AseServiceLauncher#the get AP_PORTnumber for notification#=#set -x#change this

42、which ASEserver listion toAP_PORT=48620DEVICE=-semulator-5554#the script file to be run in aseif $# -eq 1 ; thenFILE=$1elseecho $0 filenameexitfi#shell script file to be run on target(which will run ase)FILE2=t1.shTARGET_RUN_LOCATION=/dataTARGET_PYTHON_SCRIPTS_LOCATION=/sdcard/ase/scripts#prepare th

43、e FILE2echo export PYTHONPATH=/sdcard/ase/extras/python:/sdcard/ase/scripts/ $FILE2echo export AP_PORT=$AP_PORT $FILE2echo export TEMP=/sdcard/ase/extras/pythontmp $FILE2echo export PYTHONHOME=/data/data/com.google.ase/python $FILE2echo /data/data/com.google.ase/python/bin/python /sdcard/ase/scripts

44、/$FILE $FILE2#push FILEto targetadb $DEVICEpush $FILE$TARGET_PYTHON_SCRIPTS_LOCATION#push FILE2to targetadb $DEVICEpush $FILE2$TARGET_RUN_LOCATIONadb $DEVICEshell chmod 777 $TARGET_RUN_LOCATION/$FILE2#run FILE2adb $DEVICEshell $TARGET_RUN_LOCATION/$FILE2#remove FILE2from target & localadb $DEVICEshe

45、ll rm $TARGET_RUN_LOCATION/$FILE2rm $FILE2#remove FILEfrom target#adb $DEVICEshell rm $FILE$TARGET_PYTHON_SCRIPTS_LOCATION如上脚本可以很好的在 PC 侧直接执行,从而解决了自动化的问题。尝试 Android ScriptingEnvironment 之二前言前文 中我们写了一个脚本,可以通过 ADB在PC端控制 ASEPython脚本 的执行。 这里,我们就通过该脚本,研究一下 ASE 自带的例子,从而知道 ASE 的能力, 为我们或许编写自己的测试脚本做准备。简介ASE通

46、过 An droid Fa?ade封装了很多方法, 这些方法调用了An droid的API来实现功能。我们正是通过这些方法来实现我们的功能。从: 可知,这些方法都有相同的返回值:All ASEAPI calls return an object with three fields:id: a strictly increasing, numeric id associated with the API call. result: the return value of the API call, or null if there is no return value. error: a des

47、cription of any error that occurred or null if no error occurred. 从: 可以查到所有的 API外,还并记当然,具体看示例代码时会发现,除了 Android FacadeAPI 对应的 android package 用到很多其他 package, 由于本人对 python 不熟(语法还是大体知道的,但是那么多 package 就基本不懂了) , 所以研究的过程中需要不时 Google 一下那些包的使用,一 录在此。Python 的参考可以用: http:/docs.python.org/release/2.5/lib/lib.h

48、tml当然, ASE 带的 python 似乎还添加了一些非标准包,比如 Google doc service.hello_world.py1 import android这里导入 android 包2 droid = android.Android()获得 android 对象3 droid.makeToast(Hello, Android!)调用 android 方法: makeToast对 Android API 熟悉的话应该知道 Toast 就是一个提示对话框。test.py 各种测试 比较直白的部分我们就不分析了。 。import 部分1 import sys2 import typ

49、es34# Testimports.5 import android6 import BeautifulSoupFrom: Beautiful Soup 是用 Python 写的一个 HTML/XML 的解析器, 它可以很好的处理不规范标记 并生成剖析树 (parse tree) 。 它提供简单又常用的导航( navigating ),搜索以及修改剖析 树的操作。它可以大大节省你的编程时间。 对于 Ruby ,使用 Rubyful Soup 。7 import gdata.docs.serviceFrom: TheGoogle DataAPIs(Google Data) provide a s

50、imple protocol for reading and writing data on the web. Though it is possible to use these services with a simple HTTPclient, this library provides helpful tools to streamline your code and keep up with server-side changes.8 import sqlite3From: http:/docs.python.org/release/2.5/lib/module-sqlite3.ht

51、mlSQLite is a C library that provides a lightweight disk-based database that doesnt require a separate server process and allows accessingthe database using a nonstandard variant of the SQLquery language. Some applications can use SQLite for internal data storage. Its also possible to prototype an a

52、pplication using SQLiteand then port the code to a larger database such as PostgreSQLor Oracle.9 import termiosFrom: http:/docs.python.org/release/2.5/lib/module-termios.htmlThis module provides an interface to the POSIXcalls for tty I/O control. For a complete description of these calls, see the PO

53、SIXor Unix manual pages. It is only available for those Unix versions that support POSIXtermios style tty I/O control (and then only if configured at installation time).10 import timeFrom: http:/docs.python.org/release/2.5/lib/module-time.htmlThis module provides various time-related functions. It i

54、s always available, but not all functions are available on all platforms. Most of the functions defined in this module call platform C library functions with the same name. It may sometimes be helpful to consult the platform documentation, because the semantics of these functions varies among platfo

55、rms.11 import xmppFrom: xmpppy is a Python library that is targeted to provide easy scripting with Jabber. Similar projects are Twisted Words and jabber.py.12 13 droid = android.Android()1415event_loopHelper 函数16 def event_loop():17 for i in range(10):18 e = droid.receiveEvent()Receives the most rec

56、ent event (i.e. location or sensor update, etc.)19 if e.result is not None:20 return True21 time.sleep(2)22 return False尝试接收一个 event, retry 10 次。test_clipboard : 尝试系统剪切板能否工作25 def test_clipboard():26 previous = droid.getClipboard().result27 msg = Hello, world!28 droid.setClipboard(msg)29 echo = droid.getClipboard().result30 droid.setClipboar

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!