Appium+Python 连续使用send_keys()输入信息报错……

自动化注册流程修复

一、场景回溯:

如下,存在三个输入框:用户名、密码、邮箱,手动输入数据,点击[立即注册],没问题,但是脚本执行的时候报错:

self.driver.find_element(*self.register_username).send_keys(register_username)
self.driver.find_element(*self.register_password).send_keys(register_password)
self.driver.find_element(*self.register_email).send_keys(register_email)


 

二、问题分析:

send_keys()方法把输入内容的时候并未实现点击并触发输入规则的校验,虽然内容输入了,但是校验规则并未通过,而用户名是默认光标指向的,所以,在密码和邮件输入前,增加点击动作,将光标移到目标输入框即可。

三、问题解决:

在密码、邮箱输入前,增加click()动作,定位光标,如下:

self.driver.find_element(*self.register_username).send_keys(register_username)
self.driver.find_element(*self.register_password).click()
self.driver.find_element(*self.register_password).send_keys(register_password)
self.driver.find_element(*self.register_email).click()
self.driver.find_element(*self.register_email).send_keys(register_email)

### 在 Appium 自动化测试中替代 `send_keys` 的方法及解决 `KeyCharacterMap` 错误问题 在 Appium 自动化测试中,如果遇到 `send_keys` 方法无法正常工作或触发 `KeyCharacterMap.getEvents` 错误的情况,可以考虑以下替代方案和解决方案。 #### 替代方案 1:使用 `adb shell input text` 通过调用 ADB 命令直接向设备输入文本内容,可以有效避免 `send_keys` 的限制。例如: ```python import os # 使用 adb shell input text 输入文本 os.system("adb shell input text '神话'") ``` 这种方法适用于需要输入简单文本的场景,并且能够正确处理中文字符[^1]。 #### 替代方案 2:启用 Unicode 键盘支持 通过在 Desired Capabilities 中添加 `unicodeKeyboard` 和 `resetKeyboard` 参数,可以确保设备支持 Unicode 输入,从而解决中文输入问题。例如: ```python desired_caps = { 'platformName': 'Android', 'deviceName': 'Honor', 'appPackage': 'com.example.android.notepad', 'appActivity': '.NotePadActivity', 'noReset': True, 'unicodeKeyboard': True, # 启用 Unicode 输入法 'resetKeyboard': True # 测试结束后重置键盘状态 } ``` 这种配置可以显著提高 `send_keys` 方法对中文的支持能力[^2]。 #### 替代方案 3:使用 `press_keycode` 模拟按键事件 对于需要精确控制按键事件的场景,可以使用 `press_keycode` 方法发送特定的键码。例如: ```python driver.press_keycode(66) # 模拟按下 Enter 键 ``` 该方法适用于需要模拟功能键(如 Enter、Backspace 等)的场景。 #### 替代方案 4:结合 `ActionBuilder` 手动合成动作 如果需要更复杂的输入操作,可以使用 `ActionBuilder` 手动定义按键序列。例如: ```python from appium.webdriver.common.touch_action import TouchAction action_builder = ActionBuilder(driver) key_action = action_builder.key_action key_action.pause(1).press_keycode(31).pause(1).press_keycode(66) # 输入大写字母 A 并按 Enter action_builder.perform() ``` 这种方法提供了更高的灵活性,但需要开发者手动定义每个按键事件。 #### 解决 `KeyCharacterMap` 错误问题 `KeyCharacterMap.getEvents` 错误通常是由设备缺乏对某些按键的映射支持引起的。可以通过以下方式解决: 1. **启用 Unicode 键盘支持**:如前所述,在 Desired Capabilities 中设置 `unicodeKeyboard` 和 `resetKeyboard` 参数。 2. **使用低级 API**:通过 `press_keycode` 或 ADB 命令直接发送按键事件,绕过 `KeyCharacterMap` 的限制。 3. **检查设备兼容性**:确保测试设备支持所需的按键映射。如果不支持,可能需要更新设备固件或驱动程序。 #### 示例代码:综合解决方案 以下是一个综合示例,展示如何结合多种方法实现输入操作: ```python import os # 配置 Desired Capabilities desired_caps = { 'platformName': 'Android', 'deviceName': 'Honor', 'appPackage': 'com.example.android.notepad', 'appActivity': '.NotePadActivity', 'noReset': True, 'unicodeKeyboard': True, 'resetKeyboard': True } # 初始化 WebDriver driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 使用 send_keys 输入英文 element = driver.find_element_by_id('input_field') element.send_keys('Hello World') # 使用 adb shell input text 输入中文 os.system("adb shell input text '神话'") # 使用 press_keycode 模拟按键 driver.press_keycode(66) # 按下 Enter 键 ``` ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值