selenium.common.exceptions.InvalidElementStateException: Message: Cannot set the element to ‘xxxxx‘

场景:在使用appium做自动化测试,短信验证码输入框,使用send_keys(),报错
selenium.common.exceptions.InvalidElementStateException: Message: Cannot set the element to ‘123456’. Did you interact with the correct element?

解决方案:使用press_keycode()

# encoding=utf-8
import unittest

class KeyboardKeys():

    '''
    模拟键盘按键类
    '''
    # 数字0-9对应的Keycode
    number_CODE = {
        '0': 7,
        '1': 8,
        '2': 9,
        '3': 10,
        '4': 11,
        '5': 12,
        '6': 13,
        '7': 14,
        '8': 15,
        '9': 16

    }

    # 手机键
    phone_CODE = {
        'KEYCODE_CALL': 5, # 拨号键
        'KEYCODE_ENDCALL': 6, # 挂机键
        'KEYCODE_HOME': 3, # 按键Home
        'KEYCODE_MENU': 82, # 菜单键
        'KEYCODE_BACK': 4, # 返回键
        'KEYCODE_SEARCH': 84, # 搜索键
        'KEYCODE_CAMERA': 27, # 拍照建
        'KEYCODE_FOCUS': 80, # 拍照对焦键
        'KEYCODE_POWER': 26, # 电源键
        'KEYCODE_NOTIFICATION': 83, # 通知键
        'KEYCODE_MUTE': 91, # 话筒静音键
        'KEYCODE_VOLUME_MUTE': 164, # 扬声器静音键
        'KEYCODE_VOLUME_UP': 24, # 音量增加键
        'kEYCODE_VOLUME_DOWN': 25 # 音量减小键

    }

    # 控制键
    control_CODE = {
        'KEYCODE_ENTER': 66, # 回车键
        'KEYCODE_ESCAPE': 111, # ESC键
        'KEYCODE_DAPD_CENTER': 23, # 导航键 确定键
        'KEYCODE_DAPD_UP': 19, # 导航键 向上
        'KEYCODE_DAPD_DOWN': 20, # 导航键 向下
        'KEYCODE_DAPD_LEFT': 21, # 导航键 向左
        'KEYCODE_DAPD_RIGHT': 22, # 导航键 向右
        'KEYCODE_MOVE_HOME': 122, # 光标移动到开始键
        'KEYCODE_MOVE_END': 123, # 光标移动到末尾键
        'KEYCODE_PAGE_UP': 92, # 向上翻页键
        'KEYCODE_PAGE_DOWN': 93, # 向下翻页键
        'KEYCODE_DEL': 67, # 退格键
        'KEYCODE_FORWARD_DEL': 112, # 删除键
        'KEYCODE_INSERT': 124, # 插入键
        'KEYCODE_TAB': 61, # Tab键
        'KEYCODE_NUM_LOCK': 143, # 小键盘锁
        'KEYCODE_CAPS_LOCK': 115, # 大写锁定
        'KEYCODE_BREAK': 121, # Break/Pause键
        'KEYCODE_SCROLL_LOCK': 116, # 滚动锁定键
        'KEYCODE_ZOOM_IN': 168, # 放大键
        'KEYCODE_ZOOM_OUT': 169 # 缩小键

    }

    # 组合键
    combi_CODE = {
        'KEYCODE_ALT_LEFT': 'ALT+LEFT',
        'KEYCODE_ALT_RIGHT': 'ALT+RIGHT',
        'KEYCODE_CTRL_LEFT': 'Control+Left',
        'KEYCODE_CTRL_RIGHT': 'Control+right',
        'KEYCODE_SHIFT_LEFT': 'Shift+Left',
        'KEYCODE_SHIFT_RIGHT': 'Shift+right'

    }

    # 英文字母键
    words_CODE = {
        'KEYCODE_A': 29,
        'KEYCODE_B': 30,
        'KEYCODE_C': 31,
        'KEYCODE_D': 32,
        'KEYCODE_E': 33,
        'KEYCODE_F': 34,
        'KEYCODE_G': 35,
        'KEYCODE_H': 36,
        'KEYCODE_I': 37,
        'KEYCODE_J': 38,
        'KEYCODE_K': 39,
        'KEYCODE_L': 40,
        'KEYCODE_M': 41,
        'KEYCODE_N': 42,
        'KEYCODE_O': 43,
        'KEYCODE_P': 44,
        'KEYCODE_Q': 45,
        'KEYCODE_R': 46,
        'KEYCODE_S': 47,
        'KEYCODE_T': 48,
        'KEYCODE_U': 49,
        'KEYCODE_V': 50,
        'KEYCODE_W': 51,
        'KEYCODE_X': 52,
        'KEYCODE_Y': 53,
        'KEYCODE_Z': 54

    }


    def pressNumberkey(self, no, driver):
        keycode = KeyboardKeys().number_CODE[no]
        driver.press_keycode(keycode)



if __name__ == '__main__':
    unittest.main()

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Selenium的`InvalidElementStateException`异常通常表示你试图对一个无效的元素进行操作。这可能是由于多种原因,包括但不限于以下几种: 1. 元素尚未加载完成。例如,在页面滚动或延迟加载的情况下,元素可能还没有完全加载到DOM中。 2. 元素已经被其他元素覆盖或隐藏。 3. 元素被其他脚本操作(例如,使用JavaScript改变元素的可见性)。 解决这个问题的方法通常是尝试等待元素加载完成或重新选择元素。下面是一些可能的解决方案: * 确保你尝试操作元素的时机是正确的。如果你在元素加载之前尝试操作它,那么你可能会遇到这个问题。你可以使用Selenium的等待功能来等待元素加载完成。 * 确保你正在操作的元素仍然存在。如果它被其他元素覆盖或隐藏,那么你可能需要重新选择它。 * 如果你正在使用JavaScript,确保你正确地操作了元素。例如,如果你改变了元素的可见性,你可能需要使用`WebDriverWait`和`expected_conditions`来确保元素变为可见后再尝试操作它。 例如,如果你可以尝试以下的代码: ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() # 或者你正在使用的其他浏览器 driver.get("http://www.example.com") # 替换为你的网址 try: element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "myElementId"))) # 使用正确的ID替换"myElementId" # 现在你可以安全地操作element了 except selenium.common.exceptions.InvalidElementStateException: print("Element is not ready yet") ``` 这个代码会等待最多10秒,直到元素变得可见为止。如果在这个时间内元素仍然不可见,那么它会捕获异常并打印一条消息。这样可以帮助你更好地理解何时和为什么会出现这个异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Summer@123

不积跬步无以至千里,感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值