• appium+python自动化64-使用Uiautomator2执行driver.keyevent()方法报错解决


    前言

    未加'automationName': 'Uiautomator2'参数使用Uiautomator可以正常使用driver.keyevent()方法,使用Uiautomator2时driver.keyevent()方法报错:
    selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Could not proxy. Proxy error: Could not proxy command to remote server. Original error: 404 - undefined

    python V3.6
    selenium V2.53.6
    Appium-Python-Client V0.26
    appium server V1.7.1
    Uiautomator2

    遇到问题

    未加'automationName': 'Uiautomator2'参数使用Uiautomator可以正常使用driver.keyevent()方法,使用Uiautomator2时driver.keyevent()方法报错:

    from appium import webdriver
    import time
    
    desired_caps = {
                    "platformName": "Android",
                    "deviceName": "emulator-5554",     # 设备名称
                    "platformVersion": "5.1.1",     # android系统版本号
                    "appPackage": "com.yipiao",   # app包名
                    "appActivity": "com.yipiao.activity.LaunchActivity",   # 启动launch Activity
                    "noReset": True,  # 不清空数据
                    'automationName': 'Uiautomator2'  # toast 必须用Uiautomator2
                    }
    driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
    
    time.sleep(10)    # 启动时间等待,放长一点
    
    
    # Uiautomator2使用keyevent事件报错
    driver.keyevent(4)    # back事件  code 4
    

    调用keyevent方法,执行back事件,对应的code值是4,发现报错

    Traceback (most recent call last):
      File "D:/apptest/ke10/t_start.py", line 25, in <module>
        driver.keyevent(4)  # back事件  code 4
      File "E:python36libsite-packagesappiumwebdriverwebdriver.py", line 411, in keyevent
        self.execute(Command.KEY_EVENT, data)
      File "E:python36libsite-packagesseleniumwebdriver
    emotewebdriver.py", line 236, in execute
        self.error_handler.check_response(response)
      File "E:python36libsite-packagesappiumwebdrivererrorhandler.py", line 29, in check_response
        raise wde
      File "E:python36libsite-packagesappiumwebdrivererrorhandler.py", line 24, in check_response
        super(MobileErrorHandler, self).check_response(response)
      File "E:python36libsite-packagesseleniumwebdriver
    emoteerrorhandler.py", line 192, in check_response
        raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Could not proxy. Proxy error: Could not proxy command to remote server. Original error: 404 - undefined
    

    主要原因是Uiautomator2上对keyevent不支持了,用driver.press_keycode()方法可以解决

    press_keycode 和keyevent

    查看press_keycode 和keyevent 源码,发现这2个方法没啥区别,keyevent上面有个备注Needed for Selendroid,可能是老版本里面的功能。
    新版本用Uiautomator2可以使用 press_keycode 方法

    # Needed for Selendroid
        def keyevent(self, keycode, metastate=None):
            """Sends a keycode to the device. Android only. Possible keycodes can be
            found in http://developer.android.com/reference/android/view/KeyEvent.html.
    
            :Args:
             - keycode - the keycode to be sent to the device
             - metastate - meta information about the keycode being sent
            """
            data = {
                'keycode': keycode,
            }
            if metastate is not None:
                data['metastate'] = metastate
            self.execute(Command.KEY_EVENT, data)
            return self
    
        def press_keycode(self, keycode, metastate=None):
            """Sends a keycode to the device. Android only. Possible keycodes can be
            found in http://developer.android.com/reference/android/view/KeyEvent.html.
    
            :Args:
             - keycode - the keycode to be sent to the device
             - metastate - meta information about the keycode being sent
            """
            data = {
                'keycode': keycode,
            }
            if metastate is not None:
                data['metastate'] = metastate
            self.execute(Command.PRESS_KEYCODE, data)
            return self
    

    使用 press_keycode 替换 keyevent即可解决问题

    from appium import webdriver
    import time
    
    desired_caps = {
                    "platformName": "Android",
                    "deviceName": "emulator-5554",     # 设备名称
                    "platformVersion": "5.1.1",     # android系统版本号
                    "appPackage": "com.yipiao",   # app包名
                    "appActivity": "com.yipiao.activity.LaunchActivity",   # 启动launch Activity
                    "noReset": True,  # 不清空数据
                    'automationName': 'Uiautomator2'  # toast 必须用Uiautomator2
                    }
    driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
    
    time.sleep(10)    # 启动时间等待,放长一点
    
    
    # Uiautomator2使用keyevent事件报错
    # driver.keyevent(4)    # back事件  code 4
    
    # Uiautomator2使用press_keycode解决
    driver.press_keycode(4)
    

    keycode相关方法

    • driver.press_keycode(4) #发送keycode,功能:按键 Uiautomator2使用keyevent事件报错
    • driver.keyevent(4) #发送keycode,功能:按键,与press_keycode无区别 Uiautomator2正常使用
    • driver.hide_keyboard() #iOS使用key_name隐藏,安卓不使用参数,功能:隐藏键盘
    • driver.long_press_keycode(4) #发送keycode,功能:长按键

    appiumQQ交流群:779429633

  • 相关阅读:
    Kubernetes 集成研发笔记
    Rust 1.44.0 发布
    Rust 1.43.0 发布
    PAT 甲级 1108 Finding Average (20分)
    PAT 甲级 1107 Social Clusters (30分)(并查集)
    PAT 甲级 1106 Lowest Price in Supply Chain (25分) (bfs)
    PAT 甲级 1105 Spiral Matrix (25分)(螺旋矩阵,简单模拟)
    PAT 甲级 1104 Sum of Number Segments (20分)(有坑,int *int 可能会溢出)
    java 多线程 26 : 线程池
    OpenCV_Python —— (4)形态学操作
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/10850591.html
Copyright © 2020-2023  润新知