Python+Appium+Selenium如何从短信应用切回原APP不丢失当前页面状态
问题原因
你使用driver.start_activity()切回原应用时,默认会新建Activity栈启动应用,因此会回到启动页,丢失之前填写手机号后待输入验证码的页面状态。
解决方案
方案1:使用activate_app方法切回原应用
该方法只会将后台挂起的被测应用拉到前台,不会重新启动应用,原有页面状态会完全保留。
操作步骤如下:
- 提前记录你的被测应用包名,替换下方代码中的
com.your.tested.app - 拿到验证码后调用
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
相关产品推荐
相关产品推荐

