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:\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

转载于:https://www.cnblogs.com/yoyoketang/p/10850591.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Appium是一个用于自动化移动应用程序的开源工具,而Python是一种流行的编程语言,可以使用AppiumPython来实现移动应用程序的自动化测试。 连接模拟器并启动淘宝App的步骤如下: 1. 首先,需要安装AppiumPython的相关环境,包括Node.js、npm、Appium Server、PythonAppium Python客户端库。 2.打开Android模拟器,确保模拟器已经启动。 3.导入所需的Python库,包括webdriver、MobileBy和AppiumWebElement。 4.设置Appium连接参数,包括设备名称、平台版本、App路径和包名。 5.通过Appium Python客户端库中的webdriver.Remote()方法建立与Appium Server的连接。 6.使用find_element()方法找到并点击启动淘宝App的按钮。 7.等待淘宝App启动完成。 完整的Python代码示例如下: ```python from appium import webdriver from appium.webdriver.common.mobileby import MobileBy from appium.webdriver.webelement import WebElement desired_caps = { 'platformName': 'Android', 'platformVersion': '10', 'deviceName': 'emulator-5554', 'appPackage': 'com.taobao.taobao', 'appActivity': 'com.taobao.tao.homepage.MainActivity3' } driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) button = driver.find_element(MobileBy.XPATH, '//android.widget.Button[@text="淘宝"]') button.click() # 等待淘宝App启动完成 driver.implicitly_wait(10) driver.quit() ``` 请注意,上述代码中的设备名称、平台版本、App路径和包名需要根据实际情况进行修改。 以上就是使用AppiumPython连接模拟器并启动淘宝App的详细步骤和示例代码。通过这种方式,可以进行移动应用程序的自动化测试和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值