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

Python+Appium+Selenium如何从短信应用切回原APP不丢失当前页面状态

问题原因

你使用driver.start_activity()切回原应用时,默认会新建Activity栈启动应用,因此会回到启动页,丢失之前填写手机号后待输入验证码的页面状态。

解决方案

方案1:使用activate_app方法切回原应用

该方法只会将后台挂起的被测应用拉到前台,不会重新启动应用,原有页面状态会完全保留。
操作步骤如下:

  1. 提前记录你的被测应用包名,替换下方代码中的com.your.tested.app
  2. 拿到验证码后调用activate_app方法切回即可

完整代码示例:

# 替换为你自己的被测应用包名
TESTED_APP_PACKAGE = "com.your.tested.app"

# 打开短信应用获取验证码的逻辑保持不变
driver.start_activity('com.google.android.apps.messaging', 'com.google.android.apps.messaging.ui.ConversationListActivity')
driver.find_element_by_xpath("//android.support.v7.widget.RecyclerView[@content-desc='Lista wątków']/android.view.ViewGroup[1]").click()
messages = driver.find_elements_by_id('com.google.android.apps.messaging:id/message_text')
text = messages[-1].text
# 修正原代码错误:print返回None,不能直接赋值给smsCode
smsCode = text[19:26]

# 关键:直接拉取后台的被测应用回到前台,不会重启
driver.activate_app(TESTED_APP_PACKAGE)

# 此时页面停留在待填验证码的界面,直接填入即可
driver.find_element_by_id("你的验证码输入框ID").send_keys(smsCode)

方案2(更推荐):无需切换应用,直接读取系统短信内容

通过adb命令直接读取系统短信数据库的最新短信,全程不需要切换应用,完全避免页面状态丢失的问题,执行效率更高。
需要确保Appium的Desired Capabilities中开启allowTestPackages: true权限,代码示例如下:

# 调用adb命令查询收件箱最新1条短信的内容
sms_raw = driver.execute_script('mobile: shell', {
    'command': 'content',
    'args': ['query', '--uri', 'content://sms/inbox', '--projection', 'body', '--sort_order', 'date DESC', 'limit', '1']
})
# 按需解析短信内容提取验证码,可根据你的实际短信格式调整截取规则
smsCode = sms_raw.split('body=')[1].strip()[0:6]

# 直接在当前页面填入验证码即可
driver.find_element_by_id("你的验证码输入框ID").send_keys(smsCode)

内容的提问来源于stack exchange,提问作者Łukasz Błaszkiewicz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:54:03