http://www.2cto.com/kf/201409/332196.html
本文介绍calabash-android的命令行的使用,通过例子,熟悉calabash-android所调用的ruby api和常用控制台命令, 如query, touch, wait等。,。熟悉这些API有助于我们编写自定义feature。
第一步:下载app
本文所用的测试app为黑客头条,点此下载。app中view的元素如下图所示:
第二步:打开命令行,进入app的下载目录,输入如下命令
1
|
calabash-android console HackerNews.apk
|
如果一切运行正常,则会进入calabash命令行,同时可以看到提示符变为:irb(main):001:0>
此时可在命令行里输入如下命令
1
2
3
|
irb(main):
001
:
0
> reinstall_apps
irb(main):
002
:
0
> start_test_server_in_background
第一条命令用来安装被测试app和test_server, 第二天命令启动test_server,此时可以进入到程序的主界面。
|
Query的用法
query(uiquery, *args)
此函数返会一个数组,每一个数组项包含View的信息,如id,坐标,类型。在命令行中输入
1
|
irb(main):
003
:
0
> query(
"ActionBarButton"
)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
[
[
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: \"刷新内容\""
}
]
|
1
|
irb(main):
004
:
0
> query(
"ActionBarButton"
).size
|
查询keys
1
2
3
4
5
6
7
8
9
10
|
irb(main):
013
:
0
> query(
"ImageView"
).first.keys
[
[
0
]
"id"
,
[
1
]
"enabled"
,
[
2
]
"contentDescription"
,
[
3
]
"class"
,
[
4
]
"rect"
,
[
5
]
"tag"
,
[
6
]
"description"
]
|
1
|
query(
"*"
)[
0
]
|
1
|
query(
"* index:0"
)
|
query中的参数可以是通配符,如输入
1
|
irb(main):
006
:
0
> query(
"*"
)
|
通过类名来过滤元素
简单类名
之前查询元素的方法是通过简单类名,且大小写不敏感。如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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}"
}
]
|
1
|
irb(main):
010
:
0
> query(
"ImageVIew"
)
|
含有包作用域的类名
若输入以下查询命令,
1
|
irb(main):
011
:
0
> query(
"android.widget.ImageView"
)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
|
[
[
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}"
}
]
|
由此可看出:
1.当仅给出简单类名时,仅查询该类名所对应的对象
2.当查询含有包名的类名时,会给出该类的对象和该类的子类的对象。
过滤操作
可以通过id,text或class来对结果进行过滤。
指定id:
1
|
irb(main):
018
:
0
> query(
"android.widget.ImageView id:'icv_comment'"
)
|
指定text:
1
|
query(
"* text:'Login'"
)
|
其它属性
1
2
|
query(
"* width:200"
)
query(
"* enabled:false"
)
|
可以同时指定多个属性,如:
query("* enabled:true height:50") 查询原理
calabash过滤属性的语法如下:
1
|
prop:value
|
上面的例子,我们使用的属性有id,text,enabled和width.除此之外,还有更多的可以用。
每一个View对象都有一系列方法,如View有isEnabled方法。当calabash准备去解析query中传入的属性时,它会以如下的顺序调用View的方法:prop(),getProp()和isProp().
故对于enabled属性,它会尝试调用enabled(),getEnabled()或isEnabled().最后将返回结果与query中指定的值进行比较。
有用的技巧
除了以上的查询语句,还有其它有用的技巧
marked
此关键字通过名称来标识一个View,用来比较id, text或contentDescription属性。
1
|
qeuery(
"button marked:'login_button'"
)
|
可指定query中的*args参数来控制返回的结果。
返回id
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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"
]
|
1
|
irb(main):
006
:
0
> query(
"android.widget.ImageView enabled:true"
, :id)
|
1
|
query(
"android.widget.ImageView enabled:true"
,
"id"
)
|
1
|
query(android.widget.ImageView
", "
text
", "
toLowerCase")
|
设置元素的值:(暂未调试)
1
|
irb(main):
034
:
0
> query(
"edittext index:1"
, :setText =>
"1234"
)
|