Appium自动化测试系列2- 写一个Python测试脚本来测试一下YY语音

自动化之路 专栏收录该内容
129 篇文章 1 订阅

我们在《Appium自动化测试系列1-Appium环境的安装和配置》里已经搭好了Appium的基本环境,这一章,我们就来真刀真枪使用一下Appium, 看看Appium是如果来实现自动化测试的。在写测试脚本之前,我们先安装几个必要的Python三方库。

1 安装Python的setuptools库 (因为安装Python的Selenium库需要用到它)

    1) 下载setuptools文件并解压 https://pypi.python.org/pypi/setuptools/12.0.4#downloads

    2) 打开CMD窗口,进入解压后的setuptools目录,执行命令python setup.py install 进行安装 

?
1
D:\setuptools-12.0.4>python setup.py  install

2 安装Python的Selenium库(Appium是采用WebDriver传输测试请求,利用Selenium的WebDriver功能)

    1) 下载selenium文件并解压 https://pypi.python.org/pypi/selenium/2.44.0

    2) 打开CMD窗口,进入解压后的selenium目录,执行命令python setup.py install 进行安装 

?
1
D:\selenium-2.44.0>python setup.py  install

3 下载Python的HTMLTestRunner.py,保存到Python安装路径的Lib目录下(如C:\Python27\Lib)。

下载地址 http://tungwaiyip.info/software/HTMLTestRunner.html


接下来,在你的Android手机上安装一个YY语音(我们以YY语音为例),然后把你的手机连接到电脑(建议采用Android4.x的手机),执行命令adb devices 查看手机的deviceName,比如我的手机deviceName是 4d00b6a5bee8a047

?
1
2
3
D:\>adb devices
List of devices attached
4d00b6a5bee8a047        device


开始写测试脚本my_android_test.py(脚本里要配置正确deviceName,软件包和启动Activity):

?
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
#coding:utf-8
import  os
import  HTMLTestRunner
import  unittest
from  selenium  import  webdriver
 
# Returns abs path relative to this file and not cwd
PATH  =  lambda  p: os.path.abspath(
     os.path.join(os.path.dirname(__file__), p)
)
 
class  elementA(unittest.TestCase):
     def  test_( self ):  
         desired_caps  =  {}
         desired_caps[ 'deviceName' =  '4d00b6a5bee8a047'   #adb devices查到的设备名
         desired_caps[ 'platformName' =  'Android'
         desired_caps[ 'platformVersion' =  '4.2'      
         desired_caps[ 'appPackage' =  'com.duowan.mobile'   #被测App的包名
         desired_caps[ 'appActivity' =  'com.yy.mobile.ui.splash.SplashActivity'  #启动时的Activity
         driver  =  webdriver.Remote( 'http://localhost:4723/wd/hub' , desired_caps)
 
         el  =  driver.find_element_by_name(u "神曲" )
         self .assertIsNotNone(el)
         el.click()     
         yueBang  =  driver.find_element_by_name(u "月榜" )
         self .assertIsNotNone(yueBang)
         yueBang.click()    
         driver.quit()
     
if  __name__  = =  '__main__' :
     testunit = unittest.TestSuite()         #定义一个单元测试容器
     testunit.addTest(elementA( "test_" ))   #将测试用例加入到测试容器中    
     filename = "./myAppiumLog.html"         #定义个报告存放路径,支持相对路径。
     fp = file (filename, 'wb' )
     runner  =  HTMLTestRunner.HTMLTestRunner(stream = fp,title = 'Report_title' ,description = 'Report_description' )   #使用HTMLTestRunner配置参数,输出报告路径、报告标题、描述
     runner.run(testunit)                  #自动进行测试


打开一个CMD窗口,启动Appium。 再打开一个CMD新窗口,执行命令 python my_android_test.py 执行测试脚本。

测试完成后,会在测试脚本的同目录下生成一个名为 myAppiumLog.html的Log文件(见脚本中相应的代码段)。同时,Appium运行窗口默认会打印整个测试过程的所有信息,如下所示:(整个测试过程,Appium做了以下一些事:获取手机系统信息、启动UIAutomator、端口forward、启动手机上的Appium服务、执行控件的操作如查找点击等等)

?
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
info: --> POST  /wd/hub/session  { "desiredCapabilities" :{ "platformVersion" : "4.2" , "deviceName" : "4d00b6a5bee8a047" , "platformName" : "Android" , "appActivity" :
"com.yy.mobile.ui.splash.SplashActivity" , "appPackage" : "com.duowan.mobile" }}
info: Client User-Agent string: Python-urllib /2 .7
info: [debug] Didn't get app but did get Android package, will attempt to launch it on the device
info: [debug] Creating new appium session 1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35
info: Starting android appium
info: [debug] Getting Java version
info: Java version is: 1.6.0_45
info: [debug] Using fast reset?  true
info: [debug] Preparing device  for  session
info: [debug] Not checking whether app is present since we are assuming it's already on the device
info: [debug] Checking whether adb is present
info: [debug] Using adb from C:\Android\sdk\platform-tools\adb.exe
info: Retrieving device
info: [debug] Trying to  find  a connected android device
info: [debug] Getting connected devices...
info: [debug] executing cmd: C:\Android\sdk\platform-tools\adb.exe devices
info: [debug] 2 device(s) connected
info: Found device 4d00b6a5bee8a047
info: [debug] Setting device  id  to 4d00b6a5bee8a047
info: [debug] Waiting  for  device to be ready and to respond to shell commands (timeout = 5)
info: [debug] executing cmd: C:\Android\sdk\platform-tools\adb.exe -s 4d00b6a5bee8a047 wait- for -device
info: [debug] executing cmd: C:\Android\sdk\platform-tools\adb.exe -s 4d00b6a5bee8a047 shell  "echo 'ready'"
info: [debug] Starting logcat capture
warn: No app capability, can't parse package /activity
info: [debug] Getting device API level
info: [debug] executing cmd: C:\Android\sdk\platform-tools\adb.exe -s 4d00b6a5bee8a047 shell  "getprop ro.build.version.sdk"
info: [debug] Device is at API Level 19
info: Device API level is: 19
info: [debug] Apk doesn't exist locally
info: [debug] executing cmd: C:\Android\sdk\platform-tools\adb.exe -s 4d00b6a5bee8a047 shell  "rm -rf /data/local/tmp/strings.json"
info: [debug] Not uninstalling app since server not started with --full-reset
info: [debug] Skipping  install  since we launched with a package instead of an app path
info: [debug] Forwarding system:4724 to device:4724
info: [debug] executing cmd: C:\Android\sdk\platform-tools\adb.exe -s 4d00b6a5bee8a047 forward tcp:4724 tcp:4724
info: [debug] Pushing appium bootstrap to device...
info: [debug] executing cmd: C:\Android\sdk\platform-tools\adb.exe -s 4d00b6a5bee8a047 push "C:\\Users\\Administrator\\AppData\\Roaming\\npm\\node_mod
ules\\appium\\build\\android_bootstrap\\AppiumBootstrap.jar"  /data/local/tmp/
info: [debug] Pushing settings apk to device...
info: [debug] executing cmd: C:\Android\sdk\platform-tools\adb.exe -s 4d00b6a5bee8a047  install  "C:\Users\Administrator\AppData\Roaming\npm\node_module
s\appium\build\settings_apk\settings_apk-debug.apk"
info: [debug] Pushing unlock helper app to device...
info: [debug] executing cmd: C:\Android\sdk\platform-tools\adb.exe -s 4d00b6a5bee8a047  install  "C:\Users\Administrator\AppData\Roaming\npm\node_module
s\appium\build\unlock_apk\unlock_apk-debug.apk"
info: Starting App
info: [debug] Attempting to  kill  all  'uiautomator'  processes
info: [debug] Getting all processes with  'uiautomator'
info: [debug] executing cmd: C:\Android\sdk\platform-tools\adb.exe -s 4d00b6a5bee8a047 shell  "ps 'uiautomator'"
info: [debug] No matching processes found
info: [debug] Running bootstrap
info: [debug] spawning: C:\Android\sdk\platform-tools\adb.exe -s 4d00b6a5bee8a047 shell uiautomator runtest AppiumBootstrap.jar -c io.appium.android.b
ootstrap.Bootstrap
info: [debug] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS: numtests=1
info: [debug] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS: stream=
info: [debug] [UIAUTOMATOR STDOUT] io.appium.android.bootstrap.Bootstrap:
info: [debug] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:  id =UiAutomatorTestRunner
info: [debug] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS:  test =testRunServer
info: [debug] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS: class=io.appium.android.bootstrap.Bootstrap
info: [debug] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS: current=1
info: [debug] [UIAUTOMATOR STDOUT] INSTRUMENTATION_STATUS_CODE: 1
info: [debug] [BOOTSTRAP] [debug] Socket opened on port 4724
info: [debug] [BOOTSTRAP] [debug] Appium Socket Server Ready
info: [debug] [BOOTSTRAP] [debug] Loading json...
info: [debug] Waking up device  if  it's not alive
info: [debug] Pushing  command  to appium work queue: [ "wake" ,{}]
info: [debug] [BOOTSTRAP] [debug] Registered crash watchers.
info: [debug] [BOOTSTRAP] [debug] Client connected
info: [debug] [BOOTSTRAP] [debug] Got data from client: { "cmd" : "action" , "action" : "wake" , "params" :{}}
info: [debug] [BOOTSTRAP] [debug] Got  command  of  type  ACTION
info: [debug] [BOOTSTRAP] [debug] Got  command  action: wake
info: [debug] [BOOTSTRAP] [debug] Returning result: { "value" : true , "status" :0}
info: [debug] executing cmd: C:\Android\sdk\platform-tools\adb.exe -s 4d00b6a5bee8a047 shell  "dumpsys window"
info: [debug] Screen already unlocked, continuing.
info: [debug] Pushing  command  to appium work queue: [ "getDataDir" ,{}]
info: [debug] [BOOTSTRAP] [debug] Got data from client: { "cmd" : "action" , "action" : "getDataDir" , "params" :{}}
info: [debug] [BOOTSTRAP] [debug] Got  command  of  type  ACTION
info: [debug] [BOOTSTRAP] [debug] Got  command  action: getDataDir
info: [debug] [BOOTSTRAP] [debug] Returning result: { "value" : "\/data\/local\/tmp" , "status" :0}
info: [debug] dataDir  set  to:  /data/local/tmp
info: [debug] Pushing  command  to appium work queue: [ "compressedLayoutHierarchy" ,{ "compressLayout" : false }]
info: [debug] [BOOTSTRAP] [debug] Got data from client: { "cmd" : "action" , "action" : "compressedLayoutHierarchy" , "params" :{ "compressLayout" : false }}
info: [debug] [BOOTSTRAP] [debug] Got  command  of  type  ACTION
info: [debug] [BOOTSTRAP] [debug] Got  command  action: compressedLayoutHierarchy
info: [debug] [BOOTSTRAP] [debug] Returning result: { "value" : false , "status" :0}
info: [debug] Getting device API level
info: [debug] executing cmd: C:\Android\sdk\platform-tools\adb.exe -s 4d00b6a5bee8a047 shell  "getprop ro.build.version.sdk"
info: [debug] Device is at API Level 19
info: [debug] executing cmd: C:\Android\sdk\platform-tools\adb.exe -s 4d00b6a5bee8a047 shell "am start -S -a android.intent.action.MAIN -c android.int
ent.category.LAUNCHER -f 0x10200000 -n com.duowan.mobile /com .yy.mobile.ui.splash.SplashActivity"
info: [debug] Waiting  for  pkg  "com.duowan.mobile"  and activity  "com.yy.mobile.ui.splash.SplashActivity"  to be focused
info: [debug] Getting focused package and activity
info: [debug] executing cmd: C:\Android\sdk\platform-tools\adb.exe -s 4d00b6a5bee8a047 shell  "dumpsys window windows"
info: [debug] Device launched! Ready  for  commands
info: [debug] Setting  command  timeout to the default of 60 secs
info: [debug] Appium session started with sessionId 1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35
info: <-- POST  /wd/hub/session  303 8377.855 ms - 9
info: --> GET  /wd/hub/session/1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35  {}
info: [debug] Responding to client with success: { "status" :0, "value" :{ "platform" : "LINUX" , "browserName" : "Android" , "platformVersion" : "4.2" ,"webStorageEn
abled ":false," takesScreenshot ":true," javascriptEnabled ":true," databaseEnabled ":false," networkConnectionEnabled ":true," locationContextEnabled ":false," w
arnings ":{}," desired ":{" platformVersion ":" 4.2 "," deviceName ":" 4d00b6a5bee8a047 "," platformName ":" Android "," appActivity ":" com.yy.mobile.ui.splash.SplashA
ctivity "," appPackage ":" com.duowan.mobile "}," deviceName ":" 4d00b6a5bee8a047 "," platformName ":" Android "," appActivity ":" com.yy.mobile.ui.splash.SplashActiv
ity "," appPackage ":" com.duowan.mobile "}," sessionId ":" 1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35"}
info: <-- GET  /wd/hub/session/1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35  200 2.143 ms - 641 { "status" :0, "value" :{ "platform" : "LINUX" , "browserName" : "Android" ,
"platformVersion" : "4.2" , "webStorageEnabled" : false , "takesScreenshot" : true , "javascriptEnabled" : true , "databaseEnabled" : false , "networkConnectionEnabled" :t
rue, "locationContextEnabled" : false , "warnings" :{}, "desired" :{ "platformVersion" : "4.2" , "deviceName" : "4d00b6a5bee8a047" , "platformName" : "Android" ,"appActiv
ity ":" com.yy.mobile.ui.splash.SplashActivity "," appPackage ":" com.duowan.mobile "}," deviceName ":" 4d00b6a5bee8a047 "," platformName ":" Android "," appActivity"
: "com.yy.mobile.ui.splash.SplashActivity" , "appPackage" : "com.duowan.mobile" }, "sessionId" : "1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35" }
info: --> POST  /wd/hub/session/1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35/element  { "using" : "name" , "sessionId" : "1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35" , "value"
: "神曲" }
info: [debug] Waiting up to 0ms  for  condition
info: [debug] Pushing  command  to appium work queue: [ "find" ,{ "strategy" : "name" , "selector" : "神曲" , "context" : "" , "multiple" : false }]
info: [debug] [BOOTSTRAP] [debug] Got data from client: { "cmd" : "action" , "action" : "find" , "params" :{ "strategy" : "name" , "selector" : "神曲" , "context" : "" ,"mu
ltiple": false }}
info: [debug] [BOOTSTRAP] [debug] Got  command  of  type  ACTION
info: [debug] [BOOTSTRAP] [debug] Got  command  action:  find
info: [debug] [BOOTSTRAP] [debug] Finding 神曲 using NAME with the contextId:  multiple:  false
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[DESCRIPTION=神曲, INSTANCE=0]
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[TEXT=神曲, INSTANCE=0]
info: [debug] [BOOTSTRAP] [debug] Returning result: { "value" :{ "ELEMENT" : "1" }, "status" :0}
info: [debug] Responding to client with success: { "status" :0, "value" :{ "ELEMENT" : "1" }, "sessionId" : "1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35" }
info: <-- POST  /wd/hub/session/1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35/element  200 30359.695 ms - 87 { "status" :0, "value" :{ "ELEMENT" : "1" }, "sessionId" :"1b0
e4603-d4c8-44d7-868a-cd1c0d1f4b35"}
info: --> POST  /wd/hub/session/1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35/element/1/click  { "sessionId" : "1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35" , "id" : "1" }
info: [debug] Pushing  command  to appium work queue: [ "element:click" ,{ "elementId" : "1" }]
info: [debug] [BOOTSTRAP] [debug] Got data from client: { "cmd" : "action" , "action" : "element:click" , "params" :{ "elementId" : "1" }}
info: [debug] [BOOTSTRAP] [debug] Got  command  of  type  ACTION
info: [debug] [BOOTSTRAP] [debug] Got  command  action: click
info: [debug] [BOOTSTRAP] [debug] Returning result: { "value" : true , "status" :0}
info: [debug] Responding to client with success: { "status" :0, "value" : true , "sessionId" : "1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35" }
info: <-- POST  /wd/hub/session/1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35/element/1/click  200 3267.154 ms - 76 { "status" :0, "value" : true , "sessionId" :"1b0e460
3-d4c8-44d7-868a-cd1c0d1f4b35"}
info: --> POST  /wd/hub/session/1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35/element  { "using" : "name" , "sessionId" : "1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35" , "value"
: "站台" }
info: [debug] Waiting up to 0ms  for  condition
info: [debug] Pushing  command  to appium work queue: [ "find" ,{ "strategy" : "name" , "selector" : "站台" , "context" : "" , "multiple" : false }]
info: [debug] [BOOTSTRAP] [debug] Got data from client: { "cmd" : "action" , "action" : "find" , "params" :{ "strategy" : "name" , "selector" : "站台" , "context" : "" ,"mu
ltiple": false }}
info: [debug] [BOOTSTRAP] [debug] Got  command  of  type  ACTION
info: [debug] [BOOTSTRAP] [debug] Got  command  action:  find
info: [debug] [BOOTSTRAP] [debug] Finding 站台 using NAME with the contextId:  multiple:  false
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[DESCRIPTION=站台, INSTANCE=0]
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[TEXT=站台, INSTANCE=0]
info: [debug] [BOOTSTRAP] [debug] Returning result: { "value" : "No element found" , "status" :7}
info: [debug] Condition unmet after 190ms. Timing out.
info: [debug] Responding to client with error: { "status" :7, "value" :{ "message" :"An element could not be located on the page using the given search para
meters. "," origValue ":" No element found "}," sessionId ":" 1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35"}
info: <-- POST  /wd/hub/session/1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35/element  500 196.363 ms - 195
info: --> POST  /wd/hub/session/1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35/element  { "using" : "name" , "sessionId" : "1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35" , "value"
: "月榜" }
info: [debug] Waiting up to 0ms  for  condition
info: [debug] Pushing  command  to appium work queue: [ "find" ,{ "strategy" : "name" , "selector" : "月榜" , "context" : "" , "multiple" : false }]
info: [debug] [BOOTSTRAP] [debug] Got data from client: { "cmd" : "action" , "action" : "find" , "params" :{ "strategy" : "name" , "selector" : "月榜" , "context" : "" ,"mu
ltiple": false }}
info: [debug] [BOOTSTRAP] [debug] Got  command  of  type  ACTION
info: [debug] [BOOTSTRAP] [debug] Got  command  action:  find
info: [debug] [BOOTSTRAP] [debug] Finding 月榜 using NAME with the contextId:  multiple:  false
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[DESCRIPTION=月榜, INSTANCE=0]
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[TEXT=月榜, INSTANCE=0]
info: [debug] [BOOTSTRAP] [debug] Returning result: { "value" :{ "ELEMENT" : "2" }, "status" :0}
info: [debug] Responding to client with success: { "status" :0, "value" :{ "ELEMENT" : "2" }, "sessionId" : "1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35" }
info: <-- POST  /wd/hub/session/1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35/element  200 242.911 ms - 87 { "status" :0, "value" :{ "ELEMENT" : "2" }, "sessionId" :"1b0e4
603-d4c8-44d7-868a-cd1c0d1f4b35"}
info: --> POST  /wd/hub/session/1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35/element/2/click  { "sessionId" : "1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35" , "id" : "2" }
info: [debug] Pushing  command  to appium work queue: [ "element:click" ,{ "elementId" : "2" }]
info: [debug] [BOOTSTRAP] [debug] Got data from client: { "cmd" : "action" , "action" : "element:click" , "params" :{ "elementId" : "2" }}
info: [debug] [BOOTSTRAP] [debug] Got  command  of  type  ACTION
info: [debug] [BOOTSTRAP] [debug] Got  command  action: click
info: [debug] [BOOTSTRAP] [debug] Returning result: { "value" : true , "status" :0}
info: [debug] Responding to client with success: { "status" :0, "value" : true , "sessionId" : "1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35" }
info: <-- POST  /wd/hub/session/1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35/element/2/click  200 3377.934 ms - 76 { "status" :0, "value" : true , "sessionId" :"1b0e460
3-d4c8-44d7-868a-cd1c0d1f4b35"}
info: --> POST  /wd/hub/session/1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35/element  { "using" : "name" , "sessionId" : "1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35" , "value"
: "站台" }
info: [debug] Waiting up to 0ms  for  condition
info: [debug] Pushing  command  to appium work queue: [ "find" ,{ "strategy" : "name" , "selector" : "站台" , "context" : "" , "multiple" : false }]
info: [debug] [BOOTSTRAP] [debug] Got data from client: { "cmd" : "action" , "action" : "find" , "params" :{ "strategy" : "name" , "selector" : "站台" , "context" : "" ,"mu
ltiple": false }}
info: [debug] [BOOTSTRAP] [debug] Got  command  of  type  ACTION
info: [debug] [BOOTSTRAP] [debug] Got  command  action:  find
info: [debug] [BOOTSTRAP] [debug] Finding 站台 using NAME with the contextId:  multiple:  false
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[DESCRIPTION=站台, INSTANCE=0]
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[TEXT=站台, INSTANCE=0]
info: [debug] [BOOTSTRAP] [debug] Returning result: { "value" :{ "ELEMENT" : "3" }, "status" :0}
info: [debug] Responding to client with success: { "status" :0, "value" :{ "ELEMENT" : "3"