本文介绍calabash-android的命令行的使用,通过例子,熟悉calabash-android所调用的ruby api和常用控制台命令, 如query, touch, wait等。,。熟悉这些API有助于我们编写自定义feature。
第一步:下载app
本文所用的测试app为黑客头条,点此下载。app中view的元素如下图所示:
第二步:打开命令行,进入app的下载目录,输入如下命令
calabash-android console HackerNews.apk
如果一切运行正常,则会进入calabash命令行,同时可以看到提示符变为:irb(main):001:0>
此时可在命令行里输入如下命令
irb(main):001:0> reinstall_apps irb(main):002:0> start_test_server_in_background 第一条命令用来安装被测试app和test_server, 第二天命令启动test_server,此时可以进入到程序的主界面。每个Android应用程序都是有一系列的View组成.Button, ImageView, chekbox都是屏幕上的View。每个View都有对应的类型,程序界面可以看做是View的集合。
query(uiquery, *args)
此函数返会一个数组,每一个数组项包含View的信息,如id,坐标,类型。在命令行中输入
irb(main):003:0> query("ActionBarButton")由于在ControllerBar中有两个ActionBarButton,故输出结果如下所示:
[ [0] { "id" => nil, "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.actionbar.ActionBarBut ton", "rect" => { "center_y" => 98, "center_x" => 480, "height" => 96, "y" => 50, "width" => 96, "x" => 432 }, "tag" => nil, "description" => "ActionBarButton: \"推广\"" }, [1] { "id" => nil, "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.actionbar.ActionBarBut ton", "rect" => { "center_y" => 98, "center_x" => 576, "height" => 96, "y" => 50, "width" => 96, "x" => 528 }, "tag" => nil, "description" => "ActionBarButton: \"刷新内容\"" } ]由于返回的结果是个ruby array,我们可以使用array的方法,如获取size
irb(main):004:0> query("ActionBarButton").size返回的结果是2
查询keys
irb(main):013:0> query("ImageView").first.keys [ [0] "id", [1] "enabled", [2] "contentDescription", [3] "class", [4] "rect", [5] "tag", [6] "description" ]index
query("*")[0]
query("* index:0")
irb(main):006:0> query("*")返回屏幕中的所有元素
通过类名来过滤元素
简单类名
之前查询元素的方法是通过简单类名,且大小写不敏感。如
irb(main):010:0> query("ImageView") [ [0] { "id" => "img_up_icon", "enabled" => true, "contentDescription" => nil, "class" => "android.widget.ImageView", "rect" => { "center_y" => 97, "center_x" => 74, "height" => 67, "y" => 64, "width" => 67, "x" => 41 }, "tag" => nil, "description" => "android.widget.ImageView{41f4c740 V.ED.... .... .... 41,14-108,81 #7f060091 app:id/img_up_icon}" } ]和
irb(main):010:0> query("ImageVIew")结果一样。
含有包作用域的类名
若输入以下查询命令,
irb(main):011:0> query("android.widget.ImageView")结果如下:
[ [ 0] { "id" => "icv_up_indicator", "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.image.IconView", "rect" => { "center_y" => 98, "center_x" => 20, "height" => 50, "y" => 73, "width" => 41, "x" => 0 }, "tag" => nil, "description" => "com.airlocksoftware.holo.image.IconView{41f41cc 8 V.ED.... ........ 0,23-41,73 #7f060090 app:id/icv_up_indicator}" }, [ 1] { "id" => "img_up_icon", "enabled" => true, "contentDescription" => nil, "class" => "android.widget.ImageView", "rect" => { "center_y" => 97, "center_x" => 74, "height" => 67, "y" => 64, "width" => 67, "x" => 41 }, "tag" => nil, "description" => "android.widget.ImageView{41f4c740 V.ED.... .... .... 41,14-108,81 #7f060091 app:id/img_up_icon}" }, [ 2] { "id" => "icv", "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.image.IconView", "rect" => { "center_y" => 98, "center_x" => 480, "height" => 96, "y" => 50, "width" => 96, "x" => 432 }, "tag" => nil, "description" => "com.airlocksoftware.holo.image.IconView{4241f03 8 V.ED.... ........ 0,0-96,96 #7f060096 app:id/icv}" }, [ 3] { "id" => "icv", "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.image.IconView", "rect" => { "center_y" => 98, "center_x" => 576, "height" => 96, "y" => 50, "width" => 96, "x" => 528 }, "tag" => nil, "description" => "com.airlocksoftware.holo.image.IconView{424aa62 8 V.ED.... ........ 0,0-96,96 #7f060096 app:id/icv}" }, [ 4] { "id" => "icv_overflow", "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.image.IconView", "rect" => { "center_y" => 98, "center_x" => 672, "height" => 96, "y" => 50, "width" => 96, "x" => 624 }, "tag" => nil, "description" => "com.airlocksoftware.holo.image.IconView{41f6a6b 0 V.ED..C. ........ 500,0-596,96 #7f060095 app:id/icv_overflow}" }, [ 5] { "id" => "icv_comment", "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.image.IconView", "rect" => { "center_y" => 317, "center_x" => 63, "height" => 33, "y" => 301, "width" => 26, "x" => 50 }, "tag" => nil, "description" => "com.airlocksoftware.holo.image.IconView{42075eb 8 V.ED.... ........ 50,55-76,88 #7f060120 app:id/icv_comment}" }, [ 6] { "id" => "icv_comment", "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.image.IconView", "rect" => { "center_y" => 454, "center_x" => 49, "height" => 33, "y" => 438, "width" => 26, "x" => 36 }, "tag" => nil, "description" => "com.airlocksoftware.holo.image.IconView{4240c4d 0 V.ED.... ........ 36,89-62,122 #7f060120 app:id/icv_comment}" }, [ 7] { "id" => "icv_comment", "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.image.IconView", "rect" => { "center_y" => 557, "center_x" => 63, "height" => 33, "y" => 541, "width" => 26, "x" => 50 }, "tag" => nil, "description" => "com.airlocksoftware.holo.image.IconView{42368ad 0 V.ED.... ........ 50,55-76,88 #7f060120 app:id/icv_comment}" }, [ 8] { "id" => "icv_comment", "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.image.IconView", "rect" => { "center_y" => 660, "center_x" => 63, "height" => 33, "y" => 644, "width" => 26, "x" => 50 }, "tag" => nil, "description" => "com.airlocksoftware.holo.image.IconView{41c8a72 0 V.ED.... ........ 50,55-76,88 #7f060120 app:id/icv_comment}" }, [ 9] { "id" => "icv_comment", "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.image.IconView", "rect" => { "center_y" => 797, "center_x" => 77, "height" => 33, "y" => 781, "width" => 26, "x" => 64 }, "tag" => nil, "description" => "com.airlocksoftware.holo.image.IconView{423685d 8 V.ED.... ........ 64,89-90,122 #7f060120 app:id/icv_comment}" }, [10] { "id" => "icv_comment", "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.image.IconView", "rect" => { "center_y" => 900, "center_x" => 77, "height" => 33, "y" => 884, "width" => 26, "x" => 64 }, "tag" => nil, "description" => "com.airlocksoftware.holo.image.IconView{424c065 8 V.ED.... ........ 64,55-90,88 #7f060120 app:id/icv_comment}" }, [11] { "id" => "icv_comment", "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.image.IconView", "rect" => { "center_y" => 1037, "center_x" => 49, "height" => 33, "y" => 1021, "width" => 26, "x" => 36 }, "tag" => nil, "description" => "com.airlocksoftware.holo.image.IconView{423b43f 8 V.ED.... ........ 36,89-62,122 #7f060120 app:id/icv_comment}" }, [12] { "id" => "icv_comment", "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.image.IconView", "rect" => { "center_y" => 1140, "center_x" => 63, "height" => 33, "y" => 1124, "width" => 26, "x" => 50 }, "tag" => nil, "description" => "com.airlocksoftware.holo.image.IconView{420c0dd 8 V.ED.... ........ 50,55-76,88 #7f060120 app:id/icv_comment}" }, [13] { "id" => "icv_comment", "enabled" => true, "contentDescription" => nil, "class" => "com.airlocksoftware.holo.image.IconView", "rect" => { "center_y" => 1277, "center_x" => 63, "height" => 33, "y" => 1261, "width" => 26, "x" => 50 }, "tag" => nil, "description" => "com.airlocksoftware.holo.image.IconView{423ab81 0 V.ED.... ........ 50,89-76,122 #7f060120 app:id/icv_comment}" } ]此时返回的结果有14个元素
1.当仅给出简单类名时,仅查询该类名所对应的对象
2.当查询含有包名的类名时,会给出该类的对象和该类的子类的对象。
过滤操作
可以通过id,text或class来对结果进行过滤。
指定id:
irb(main):018:0> query("android.widget.ImageView id:'icv_comment'")主要id后面的单引号
指定text:
query("* text:'Login'")该操作会返回屏幕中含有"Login"文本的View
其它属性
query("* width:200") query("* enabled:false")注意,此处无单引号
可以同时指定多个属性,如:
calabash过滤属性的语法如下:
prop:valueprop是属性名,value是一个字符串,布尔值或整数。
上面的例子,我们使用的属性有id,text,enabled和width.除此之外,还有更多的可以用。
每一个View对象都有一系列方法,如View有isEnabled方法。当calabash准备去解析query中传入的属性时,它会以如下的顺序调用View的方法:prop(),getProp()和isProp().
故对于enabled属性,它会尝试调用enabled(),getEnabled()或isEnabled().最后将返回结果与query中指定的值进行比较。
有用的技巧
除了以上的查询语句,还有其它有用的技巧
marked
此关键字通过名称来标识一个View,用来比较id, text或contentDescription属性。
qeuery("button marked:'login_button'")返回属性
返回id
irb(main):005:0> query("android.widget.ImageView", :id) [ [ 0] "icv_up_indicator", [ 1] "img_up_icon", [ 2] "icv", [ 3] "icv", [ 4] "icv_overflow", [ 5] "icv_comment", [ 6] "icv_comment", [ 7] "icv_comment", [ 8] "icv_comment", [ 9] "icv_comment", [10] "icv_comment", [11] "icv_comment", [12] "icv_comment", [13] "icv_comment" ]可以将属性过滤与指定的属性配合使用,如
irb(main):006:0> query("android.widget.ImageView enabled:true", :id)属性也可以写成如下形式
query("android.widget.ImageView enabled:true", "id")链式调用:
query(android.widget.ImageView", "text", "toLowerCase")先对放回的对象调用getText(),然后再调用toLowerCase函数。
设置元素的值:(暂未调试)
irb(main):034:0> query("edittext index:1", :setText => "1234")暂时介绍到这儿,后续会继续更新。
原文地址:http://blog.csdn.net/bigconvience/article/details/39182161