Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 645|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-19 09:53:39 | 显示全部楼层 |阅读模式

    前言

    未加'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:\python36\lib\site-packages\appium\webdriver\webdriver.py", line 411, in keyevent
        self.execute(Command.KEY_EVENT, data)
      File "E:\python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 236, in execute
        self.error_handler.check_response(response)
      File "E:\python36\lib\site-packages\appium\webdriver\errorhandler.py", line 29, in check_response
        raise wde
      File "E:\python36\lib\site-packages\appium\webdriver\errorhandler.py", line 24, in check_response
        super(MobileErrorHandler, self).check_response(response)
      File "E:\python36\lib\site-packages\selenium\webdriver\remote\errorhandler.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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 17:11 , Processed in 0.064687 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表