You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Selenium为安卓Messenger应用输入OTP?OTP输入框不可编辑

解决Messenger自动化中OTP输入框不可编辑的问题

可行的解决方案

1. 确认元素属性后调整操作逻辑

很多OTP输入框是自定义容器(而非标准EditText),直接sendKeys会失效。先用Appium Inspector或uiautomatorviewer排查元素属性:

  • 若元素是EditText但不可编辑,先点击获取焦点再输入:
WebElement otpBox = driver.findElement(By.xpath("你的OTP框xpath"));
otpBox.click();
otpBox.sendKeys("123456");
  • 若为自定义容器,尝试定位其内部实际负责输入的子控件(比如嵌套的EditText)再操作。

2. 修正JavaScript执行代码

Android原生控件不通用value属性,改用setText方法:

JavascriptExecutor js = (JavascriptExecutor) driver;
WebElement otpElement = driver.findElement(By.id("org.securesms:id/container_zero"));
js.executeScript("arguments[0].setText('2');", otpElement);

注:仅支持原生Android控件,自定义控件可能不兼容。

3. 优化按键输入流程

单键输入失效大概率是焦点问题,先获取焦点再批量输入:

AndroidDriver dr = (AndroidDriver) driver;
// 先点击OTP区域获取焦点
dr.findElement(By.xpath("OTP区域的xpath")).click();
// 逐个输入OTP字符
String otp = "123456";
for (char c : otp.toCharArray()) {
    dr.pressKey(new KeyEvent(AndroidKey.valueOf("NUMPAD_" + c)));
}

也可以用adb命令直接输入:

((AndroidDriver) driver).executeScript("mobile: shell", ImmutableMap.of("command", "input text 123456"));

4. 读取短信自动提取OTP

若设备授权短信权限,可直接读取短信提取OTP:

// 读取最近短信并提取6位OTP
List<MobileElement> smsList = driver.findElementsByClassName("android.widget.TextView");
for (MobileElement sms : smsList) {
    String smsContent = sms.getText();
    if (smsContent.contains("OTP")) {
        Pattern pattern = Pattern.compile("\\d{6}");
        Matcher matcher = pattern.matcher(smsContent);
        if (matcher.find()) {
            String otp = matcher.group();
            driver.findElement(By.xpath("OTP输入区域xpath")).sendKeys(otp);
            break;
        }
    }
}

内容的提问来源于stack exchange,提问作者Girish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:12:10