精华内容
下载资源
问答
  • IOS appium自动化测试python脚本
  • from appium import webdriver #定义字典存放设置参数 desired_caps={} #设备平台名称 desired_caps['platformName']='Android' #设备名称使用(模拟器测试) desired_caps['deviceName']='127.0.0.1:62025' #设备...
    from appium import webdriver
    
    #定义字典存放设置参数
    desired_caps={}
    #设备平台名称
    desired_caps['platformName']='Android'
    #设备名称使用(模拟器测试)
    desired_caps['deviceName']='127.0.0.1:62025'
    #设备版本
    desired_caps[' platforVersion']='5.1.1'
    
    #真机设置以下设置
    #desired_caps['deviceName']='vivo'
    #desired_caps['platforVersion']='5.1'
    #使用adb devices获取udid
    #desired_caps['udid']=''
    
    
    #apk路径
    desired_caps['app']='D:\python\weixin.apk'
    desired_caps['appPackage']='com.tencent.mm'
    desired_caps['appActivity']='com.tencent.mm.ui.LauncherUI'
    driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
    小白入门笔记,第一次编写自动化测试脚本,请各路大神多多指点!

    推荐学习网站http://www.51zxw.net/


    展开全文
  • 我们实际跑自动化脚本的过程中,是需要用脚本调用appium启动app的,接下来就...具体的获取方法请参考APP自动化测试appium连接真机启动app,配置信息如下: { "platformName": "Android", "platformVersion": "10

    我们实际跑自动化脚本的过程中,是需要用脚本调用appium启动app的,接下来就尝试写Python脚本启动app并登陆app。环境为Windows10 + Python3.7 + appium1.18.0 + Android手机 + 今日头条app + Pycharm

    一,连接测试手机,获取测试机及被测APP配置

    具体的获取方法请参考APP自动化测试之appium连接真机启动app,配置信息如下:

    {
      "platformName": "Android",
      "platformVersion": "10",
      "deviceName": "PCT_AL10",
      "appPackage": "com.ss.android.article.news",
      "appActivity": ".activity.MainActivity"
    }
    

    二,编写Python脚本启动app

    1,编辑器推荐大家使用PyCharm,下载pycharm社区版本,免费无需破解。

    2,因为登陆需要输入账号、密码,所以这里新增了两个参数。参数unicodeKeyboard即是否启用Unicode格式输入字符串,默认值为False,设置为True则表示启用。参数resetKeyboard即使用unicodeKeyboard功能进行Unicode输入后,是否将键盘重置为原始状态,默认False。

    desired_caps = {
        "platformName": "Android",
        "platformVersion": "10",
        "deviceName": "PCT_AL10",
        "appPackage": "com.ss.android.article.news",
        "appActivity": ".activity.MainActivity",
        "unicodeKeyboard": True,
        "resetKeyboard": True,
    }
    

    3,传入desired_caps通过appium启动app,构造driver对象(即创建一个session)。

    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    

    appium在本机开启的话则IP为127.0.0.1,端口默认为4723

    4,电脑连接手机,开启appium服务,运行脚本,调试是否能启动app。

    from appium import webdriver
    
    desired_caps = {
        "platformName": "Android",
        "platformVersion": "10",
        "deviceName": "PCT_AL10",
        "appPackage": "com.ss.android.article.news",
        "appActivity": ".activity.MainActivity",
        "unicodeKeyboard": True,
        "resetKeyboard": True,
    }
    
    # 启动app
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    

    我们会看到手机上今日头条app被打开。

    三,通过appium Inspector定位元素,登陆APP

    1,登陆操作步骤为:
    启动今日头条app --> 点击【我知道了】–> 确定管理权限 --> 点击底部tab“未登陆” 进入未登录页面 --> 点击 “登陆” --> 点击“…” --> 选择密码登陆 --> 输入账号密码 --> 点击登陆

    2,根据操作步骤,使用appium的Inspector获取登陆相关操作元素的属性

    [进入appium Inspector页面](#),先点击选择元素按钮,然后在窗口左侧展示的手机页面上,点击选择需要定位的元素,窗口右侧会展示该元素的属性值。手机app页面切换后,点击窗口刷新页面按钮,左侧页面会刷新。
    

    在这里插入图片描述
    appium Inspector获取不到的元素属性的话,还可以用Android SDK里自带的工具uiautomatorviewer获取。后面会专门介绍怎样获取元素属性,这里不详述。
    在这里插入图片描述
    3,登陆操作脚本

    # -*- coding:utf-8 -*-
    
    import time
    from appium import webdriver
    
    desired_caps = {
        "platformName": "Android",
        "platformVersion": "10",
        "deviceName": "PCT_AL10",
        "appPackage": "com.ss.android.article.news",
        "appActivity": ".activity.MainActivity",
        "unicodeKeyboard": True,
        "resetKeyboard": True,
    }
    
    # 启动app
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    
    # 登陆操作
    driver.find_element_by_id("com.ss.android.article.news:id/chj").click() # 点击【我知道了】
    time.sleep(1)
    driver.find_element_by_id("android:id/button1").click() # 点击权限管理-确定按钮
    time.sleep(1)
    driver.find_element_by_xpath("//android.widget.TabWidget/android.widget.RelativeLayout[@index=3]").click() # 点击未登录
    time.sleep(1)
    driver.find_element_by_id("com.ss.android.article.news:id/a1c").click() # 未登录页点击登录按钮
    time.sleep(1)
    driver.find_element_by_id("com.ss.android.article.news:id/bfm").click() # 登录页点击“。。。”
    time.sleep(1)
    driver.find_element_by_xpath("//android.widget.LinearLayout[@index=4]").click() # 选择密码登录
    time.sleep(1)
    driver.find_element_by_id("com.ss.android.article.news:id/c7").send_keys("********")   # 输入账号
    time.sleep(1)
    driver.find_element_by_id("com.ss.android.article.news:id/ch").send_keys("********")   # 输入密码
    time.sleep(1)
    driver.find_element_by_id("com.ss.android.article.news:id/a31").click() # 点击登录
    time.sleep(5)
    

    我们查看手机,会发现手机正在自动做登录今日头条的app操作,且登录成功。

    至此,我们通过编写一个简单的Python脚本完成了登录app的操作,如果加上断言,就是一条完整的用例。

    在这里插入图片描述
    如果对软件测试、接口测试、自动化测试、面试经验交流感兴趣可以加入我们。642830685,免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。

    展开全文
  • Appium自动化测试套餐

    2021-01-22 22:10:25
    第1门课程涵盖知识点:Andriod 移动App的类型、App 自动化测试工具&框架、Android 模拟器、UiAutoMator、ADB命令、activity、monkey的操作事件、monkey命令操作、monkey命令综合案例、monkey自定义脚本、monkey...
  • 我们在《Appium自动化测试系列1-Appium环境的安装和配置》里已经搭好了Appium的基本环境,这一章,我们就来真刀真枪使用一下Appium, 看看Appium是如果来实现自动化测试的。在写测试脚本之前,我们先安装几个必要的...

    我们在《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"},"sessionId":"1b0e4603-d4c8-44d7-868a-cd1c0d1f4b35"