公司动态
Python+Appium微信自动化:从环境搭建到消息发送实战
1. 项目概述为什么选择 Python Appium 来操作微信如果你正在寻找一种能自动处理微信消息、管理好友、或者定时发送朋友圈的方法并且希望这个方案足够稳定、可编程那么 Python 配合 Appium 这套组合拳很可能是你目前能找到的最优解。这听起来可能有点“硬核”但别被吓到它的核心逻辑其实很清晰Appium 作为一个移动端自动化测试框架能像真人一样去“点击”和“输入”而 Python 则负责编写这些点击和输入的逻辑脚本。两者结合就相当于你创造了一个不知疲倦的、能精确执行你指令的“数字员工”专门用来操作你手机上的微信。我最初接触这个方案是为了解决一个很实际的问题需要定时向多个微信群发送不同的通知手动操作不仅耗时还容易出错。市面上的一些“群控”软件要么功能受限要么存在安全风险。而自己动手用 Python Appium最大的好处就是完全自主可控。你可以精确控制每一个操作步骤从打开微信、定位到某个聊天窗口、输入内容、点击发送到处理可能弹出的各种确认框整个过程你都能了如指掌。这对于需要重复性操作微信的场景比如社群运营、消息监控、自动化回复测试甚至是个人用来定时给家人发送问候都提供了一个强大且灵活的工具箱。当然这条路并非毫无门槛。你需要面对不同手机系统Android/iOS的差异、微信版本更新导致的界面元素变化、以及如何稳定地让脚本长时间运行等问题。但一旦打通其带来的效率提升和可能性扩展是非常可观的。接下来我会带你从零开始拆解整个环境搭建、脚本编写到实战优化的全过程分享我踩过的坑和总结的经验目标是让你看完就能动手实现自己的第一个微信自动化脚本。2. 环境搭建与核心工具链解析环境搭建是第一步也是最容易让人放弃的一步。很多教程只给命令却不解释为什么导致一旦报错就无从下手。这里我会详细拆解每个环节的作用和配置逻辑。2.1 核心三件套Python、Appium Server 与客户端库Python 环境这是我们的“大脑”。建议直接安装 Python 3.8 或 3.9 版本这两个版本生态兼容性最好。不要使用系统自带的 Python也尽量避免最新版本如3.12因为某些库可能尚未适配。安装时务必勾选“Add Python to PATH”这是后续一切命令能正常执行的基础。安装完成后在命令行输入python --version和pip --version确认安装成功。Appium Server这是“翻译官”和“指挥中心”。它本身是一个服务端程序负责接收我们通过 Python 脚本发送的指令比如“点击坐标(100,200)”并将其翻译成手机系统Android的UIAutomator2或iOS的XCUITest能理解的底层命令。安装 Appium Server 有两种主流方式桌面版Appium Desktop对于新手极度友好。它提供了一个图形界面可以启动/停止服务更重要的是内置了“元素检查器”可以像浏览器F12一样查看手机界面上各个按钮、文本框的ID、文字等属性这对我们后续编写脚本定位元素至关重要。从官网下载安装即可。命令行版通过npm安装更轻量更适合集成到持续集成CI流程中。需要先安装Node.js然后通过npm install -g appium安装。同时为了驱动最新Android设备通常还需要单独安装appium-uiautomator2-driver。注意很多人在启动Appium Server后遇到连接问题是因为没有安装对应的驱动程序。对于Android自动化务必确保安装了uiautomator2驱动。可以通过命令行appium driver install uiautomator2来安装。Python 客户端库Appium-Python-Client这是“传令兵”。我们通过pip install Appium-Python-Client来安装这个库。它提供了一系列Python类和方法让我们能用Python代码优雅地给Appium Server发送指令而不是去直接拼接复杂的HTTP请求。它底层基于Selenium的WebDriver协议所以如果你有Selenium Web自动化的经验会发现很多API是相通的。2.2 Android 开发环境配置以Android为例既然要操作手机就必须让电脑能识别并控制手机。对于Android核心是ADB和开启开发者选项。ADBAndroid Debug Bridge它是电脑与Android设备通信的桥梁。通常它包含在Android SDK Platform-Tools中。你需要下载并解压然后将其路径例如D:\platform-tools添加到系统的环境变量PATH里。完成后在命令行输入adb devices如果能看到连接设备的序列号并显示device说明连接成功。手机端设置开启开发者模式连续点击手机“设置”-“关于手机”-“版本号”7次。开启USB调试在开发者选项中找到“USB调试”将其打开。其他可能需要的选项在开发者选项中建议同时开启“禁止权限监控”防止安装Appium设置需要的辅助应用时被拦截和“保持唤醒状态”防止脚本运行时手机锁屏。实操心得使用原装数据线并且连接电脑时手机弹出的“允许USB调试吗”的RSA密钥指纹授权框一定要点击“始终允许”。这是很多连接失败问题的根源。2.3 编写你的第一个连接脚本环境配好后我们来写一个最简单的脚本目标是打开手机上的微信。这个脚本包含了所有核心配置参数。from appium import webdriver from appium.options.android import UiAutomator2Options import time # 1. 定义设备与App的配置参数 desired_caps { platformName: Android, # 系统平台 platformVersion: 13, # 手机系统版本在手机设置里查看 deviceName: your_device_serial, # 设备名通过 adb devices 获取 appPackage: com.tencent.mm, # 微信的包名 appActivity: .ui.LauncherUI, # 微信的启动Activity noReset: True, # 是否在会话前重置App状态True表示不清空微信数据 automationName: UiAutomator2, # 自动化引擎Android必选 newCommandTimeout: 600, # 命令超时时间单位秒设长一些避免意外断开 } # 2. 将配置转换为Appium-Python-Client接受的Options对象推荐方式 options UiAutomator2Options().load_capabilities(desired_caps) # 3. 连接Appium Server # 默认情况下Appium Server运行在本地4723端口 driver webdriver.Remote(http://localhost:4723, optionsoptions) # 4. 等待微信完全启动 time.sleep(5) # 这是一个简单的等待实际生产脚本应用更智能的等待方式 print(微信已成功启动) # 5. 这里可以开始你的自动化操作了... # 6. 操作结束后关闭会话 driver.quit()关键参数解析deviceName不是手机型号而是ADB识别到的设备序列号。在命令行用adb devices命令查看第一列。appPackage和appActivity如何获取有两个方法1) 打开微信在命令行输入adb shell dumpsys window | findstr mCurrentFocusWindows或grep mCurrentFocusMac/Linux输出结果中com.tencent.mm后面跟的就是当前Activity。2) 使用Appium Desktop的Inspector功能启动微信它会自动捕获这些信息。noReset: True非常重要。设为TrueAppium就不会在每次运行脚本前清除微信的数据如登录状态、聊天记录。这意味着你只需要登录一次微信后续脚本都可以直接操作已登录的账号。运行这个脚本前请确保1) 手机通过USB连接电脑adb devices可见2) Appium Server已经启动点击了Appium Desktop的Start Server按钮。如果一切顺利你将看到手机自动解锁如果需要并打开微信。3. 元素定位自动化操作的“眼睛”脚本能打开微信了但如何告诉它去点击“通讯录”或向某个好友发送消息呢这就需要“元素定位”。我们可以把手机屏幕想象成一个网页上面的每个按钮、输入框都是一个“元素”我们需要找到它们的唯一“身份证”定位符然后操作它。3.1 使用 Appium Inspector 捕获元素Appium Desktop 内置的 Inspector 是这个环节的神器。启动它填入上述连接配置点击“Start Session”它会将当前手机界面镜像到电脑上。鼠标移动到镜像界面的任何元素上右侧就会显示该元素的所有属性。最重要的几个属性resource-id相当于网页中的id是最理想的定位方式通常唯一。微信的很多关键元素有id如搜索框的com.tencent.mm:id/fcn。text元素的显示文本。例如“通讯录”、“发现”。但要注意如果软件国际化文本会变。content-desc内容描述用于无障碍访问。部分元素可能有。class元素类型如android.widget.TextView。通常不唯一需要结合其他属性。xpath一种通过层级路径定位元素的方式非常强大但可能随版本更新而失效。3.2 六大定位策略实战代码示例假设我们要定位微信底部的“通讯录”选项卡。from appium.webdriver.common.appiumby import AppiumBy import time # 等待界面稳定这是良好实践 time.sleep(2) # 方法1通过ID定位最优先使用 # 前提通过Inspector发现“通讯录”的resource-id是 com.tencent.mm:id/cns contacts_by_id driver.find_element(AppiumBy.ID, com.tencent.mm:id/cns) contacts_by_id.click() # 方法2通过文本内容定位 contacts_by_text driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, new UiSelector().text(通讯录)) contacts_by_text.click() # 方法3通过XPath定位谨慎使用 # 这是一个示例实际XPath需要根据Inspector生成的来调整 contacts_by_xpath driver.find_element(AppiumBy.XPATH, //android.widget.TextView[text通讯录]) contacts_by_xpath.click() # 方法4通过Accessibility ID即content-desc定位 # 如果元素有content-desc属性 # some_element driver.find_element(AppiumBy.ACCESSIBILITY_ID, 描述内容) # 方法5通过类名定位通常需要结合其他条件 # 例如找到当前界面所有的文本框 # text_views driver.find_elements(AppiumBy.CLASS_NAME, android.widget.TextView) # 方法6通过CSS选择器定位主要用于混合应用或WebView纯原生应用少用注意事项find_element返回找到的第一个匹配元素find_elements返回一个列表。微信的界面结构复杂同一个class或text的元素可能非常多使用非唯一属性定位时务必先用find_elements查看数量或结合更复杂的XPath。3.3 智能等待让脚本更稳定直接使用time.sleep(5)是“硬等待”效率低下且不可靠。推荐使用“显式等待”它让脚本智能地等待某个条件成立后再执行下一步。from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from appium.webdriver.common.appiumby import AppiumBy # 设置一个最长等待10秒的等待器 wait WebDriverWait(driver, 10) # 等待“通讯录”元素出现并可点击 contacts_tab wait.until( EC.element_to_be_clickable((AppiumBy.ID, com.tencent.mm:id/cns)) ) contacts_tab.click() # 等待某个包含特定文本的元素出现 search_bar wait.until( EC.presence_of_element_located((AppiumBy.ANDROID_UIAUTOMATOR, new UiSelector().textContains(搜索))) )显式等待能极大提高脚本的健壮性特别是在网络波动或手机卡顿时避免因元素未加载完成而导致的定位失败。4. 核心操作封装从打开聊天到发送消息掌握了定位我们就可以组合各种基础操作完成复杂的业务流程了。这里以“向指定好友发送一条文本消息”为例拆解全流程。4.1 启动微信并进入主界面我们已经有了连接脚本。假设我们使用noReset: True配置微信已经是登录状态。启动后我们通常需要确保回到微信的主界面消息列表页。def back_to_home(driver): 尝试通过多次回退键确保回到微信主界面 home_identifier (AppiumBy.ID, com.tencent.mm:id/cns) # 假设底部“微信”选项卡的ID for _ in range(5): # 最多尝试回退5次 try: # 如果找到了“微信”选项卡说明已在主界面 driver.find_element(*home_identifier) print(已在微信主界面) break except: # 如果没找到则按一次回退键 driver.back() time.sleep(0.5) else: print(警告可能未成功返回主界面)4.2 定位并进入指定好友聊天窗口进入主界面后通常有两种方式进入聊天通过搜索或通过通讯录列表。这里展示更通用的搜索方式。def open_chat_with_friend(driver, friend_name): 通过搜索打开与指定好友的聊天窗口 :param driver: webdriver 实例 :param friend_name: 好友备注或昵称 wait WebDriverWait(driver, 10) # 1. 点击主界面顶部的搜索框 search_box wait.until( EC.element_to_be_clickable((AppiumBy.ID, com.tencent.mm:id/fcn)) ) search_box.click() time.sleep(1) # 等待搜索界面动画 # 2. 在搜索输入框中输入好友名称 # 注意搜索框获得焦点后可能是一个新的输入框元素 search_input wait.until( EC.presence_of_element_located((AppiumBy.CLASS_NAME, android.widget.EditText)) ) search_input.clear() search_input.send_keys(friend_name) time.sleep(2) # 等待搜索结果加载 # 3. 在搜索结果中点击对应的好友条目 # 这里定位比较复杂通常搜索结果列表是一个RecyclerView好友条目是它的子项。 # 一种策略是找到所有包含好友名称的文本元素然后点击其父级可点击区域。 # 使用UIAutomator的文本匹配功能更可靠 friend_in_result driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, fnew UiSelector().textContains({friend_name})) friend_in_result.click() # 4. 等待聊天界面加载完成通常通过判断输入框是否出现 wait.until( EC.presence_of_element_located((AppiumBy.ID, com.tencent.mm:id/auj)) # 聊天输入框的ID ) print(f已进入与【{friend_name}】的聊天窗口)4.3 在聊天界面执行发送操作进入聊天窗口后发送文本、图片、表情等操作就相对标准了。def send_text_message(driver, message): 在当前聊天窗口中发送文本消息 :param driver: webdriver 实例 :param message: 要发送的文本内容 wait WebDriverWait(driver, 5) # 1. 定位聊天输入框 input_box wait.until( EC.element_to_be_clickable((AppiumBy.ID, com.tencent.mm:id/auj)) ) # 2. 点击输入框以激活 input_box.click() time.sleep(0.5) # 3. 输入文本内容 input_box.send_keys(message) # 4. 定位并点击发送按钮 # 发送按钮的ID可能是 com.tencent.mm:id/aur send_button wait.until( EC.element_to_be_clickable((AppiumBy.ID, com.tencent.mm:id/aur)) ) send_button.click() print(f消息发送成功: {message}) # 组合函数完成整个流程 back_to_home(driver) open_chat_with_friend(driver, 测试好友) send_text_message(driver, 这是一条由PythonAppium自动发送的消息时间 time.strftime(%Y-%m-%d %H:%M:%S))4.4 处理弹窗与权限自动化过程中最讨厌的就是各种意外弹窗比如“是否允许读取相册”、“电池优化提示”等。我们需要在脚本中加入“弹窗处理机制”。def handle_common_popups(driver): 尝试关闭一些常见的干扰弹窗 # 这是一个示例列表需要根据实际遇到的弹窗补充 popup_selectors [ (AppiumBy.ANDROID_UIAUTOMATOR, new UiSelector().textContains(允许)), (AppiumBy.ANDROID_UIAUTOMATOR, new UiSelector().textContains(同意)), (AppiumBy.ANDROID_UIAUTOMATOR, new UiSelector().textContains(确定)), (AppiumBy.ANDROID_UIAUTOMATOR, new UiSelector().textContains(知道了)), # 微信自身的一些弹窗比如“切换到简体中文” # (AppiumBy.ID, com.tencent.mm:id/某弹窗确定按钮ID), ] for selector in popup_selectors: try: # 设置一个很短的超时快速检查是否存在 element WebDriverWait(driver, 1.5).until( EC.presence_of_element_located(selector) ) print(f检测到弹窗尝试点击: {selector}) element.click() time.sleep(0.5) # 给弹窗关闭一点时间 except: pass # 没找到这个弹窗继续检查下一个可以在关键操作步骤前后调用这个函数例如在open_chat_with_friend函数的一开始就调用handle_common_popups(driver)。5. 实战进阶封装与常用功能实现当基础操作稳定后我们应该考虑代码的复用性和可维护性将其封装成函数或类。同时实现一些更实用的功能。5.1 封装一个微信自动化工具类class WeChatAutomator: def __init__(self, device_serial, appium_server_urlhttp://localhost:4723): self.server_url appium_server_url self.device_serial device_serial self.driver None self._init_driver() def _init_driver(self): 初始化Appium驱动 options UiAutomator2Options() options.platform_name Android options.device_name self.device_serial options.app_package com.tencent.mm options.app_activity .ui.LauncherUI options.no_reset True options.automation_name UiAutomator2 print(f正在连接设备 {self.device_serial}...) self.driver webdriver.Remote(self.server_url, optionsoptions) # 设置一个全局的隐式等待作为查找元素的超时后备 self.driver.implicitly_wait(10) print(微信驱动初始化成功。) def send_text_to_friend(self, friend_name, message): 核心功能给好友发送文本消息 try: self._back_to_home() self._handle_popups() self._open_chat_via_search(friend_name) self._handle_popups() # 进入聊天窗口后可能还有弹窗 self._type_and_send(message) print(f✅ 已向【{friend_name}】发送消息。) return True except Exception as e: print(f❌ 发送消息失败: {e}) # 这里可以添加截图功能保存错误现场 # self.driver.save_screenshot(ferror_{int(time.time())}.png) return False # 将前面章节的函数改为私有方法如 _back_to_home, _open_chat_via_search, _type_and_send, _handle_popups # ... (此处省略具体实现参考前面章节的代码) def quit(self): 关闭驱动 if self.driver: self.driver.quit() print(驱动已关闭。) # 使用示例 if __name__ __main__: bot WeChatAutomator(device_serial你的设备序列号) bot.send_text_to_friend(文件传输助手, 工具类测试消息) bot.quit()5.2 实现更多实用功能1. 发送图片或文件原理是点击聊天输入框旁的“”号进入菜单选择“相册”或“文件”然后定位到图片并点击发送。关键在于定位文件选择列表里的元素通常需要结合resource-id和text。def send_image_from_gallery(self, image_name_part): 从相册选择图片发送需提前授予存储权限 # 点击加号按钮 plus_btn self._wait_and_find(ID, com.tencent.mm:id/au_) # 加号按钮ID示例 plus_btn.click() # 点击“相册”选项 album_item self._wait_and_find(UIAUTOMATOR, text(相册)) album_item.click() # 等待相册加载然后定位图片这里非常依赖具体相册布局 # 可能需要使用 UiScrollable 进行滚动查找 # image self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, # new UiSelector().descriptionContains({}).format(image_name_part)) # image.click() # 点击发送原图按钮 # send_btn self._wait_and_find(ID, com.tencent.mm:id/某发送按钮ID) # send_btn.click()2. 获取聊天记录这比发送更复杂因为需要解析ListView或RecyclerView。思路是定位到聊天消息列表的容器然后获取其下所有子元素再根据元素的类型发送方/接收方、文本/图片来解析。def get_recent_messages(self, max_count10): 获取当前聊天窗口最近的几条文本消息简化版 messages [] # 假设消息列表容器的ID是 com.tencent.mm:id/apa message_container self.driver.find_element(AppiumBy.ID, com.tencent.mm:id/apa) # 获取容器内所有的TextView实际消息结构复杂得多 text_views message_container.find_elements(AppiumBy.CLASS_NAME, android.widget.TextView) for tv in text_views[-max_count:]: # 取最后几个 msg_text tv.text if msg_text and len(msg_text.strip()) 0: messages.append(msg_text.strip()) return messages3. 自动化添加好友流程点击“”-“添加朋友”-输入微信号/手机号-点击搜索-点击“添加到通讯录”-输入验证语-点击发送。每一步都需要稳定的元素定位和适当的等待并且要处理对方设置的各种验证问题。6. 稳定性优化与高级技巧脚本写出来容易但要稳定运行尤其是在不同设备、不同网络环境下就需要一些优化技巧。6.1 元素定位稳定性提升策略策略一使用相对稳定的定位符优先级resource-idcontent-desctextclass。微信的部分resource-id是动态的包含数字但大部分核心界面的ID是稳定的。需要定期用Inspector确认。策略二组合定位与模糊匹配当单一属性不稳定时可以组合使用。# 使用多个属性进行XPath定位 element driver.find_element(AppiumBy.XPATH, //android.widget.Button[resource-idcom.tencent.mm:id/btn and text确定]) # 使用UIAutomator2进行模糊匹配 element driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, new UiSelector().className(android.widget.TextView).textContains(搜索))策略三封装智能查找函数编写一个函数尝试多种定位方式直到成功。def find_element_safely(driver, locators, timeout10): 安全查找元素尝试多种定位策略 :param locators: 一个元组列表如 [(ID, id1), (XPATH, //xpath1), (TEXT, 文本1)] wait WebDriverWait(driver, timeout) for by, value in locators: try: if by ID: return wait.until(EC.presence_of_element_located((AppiumBy.ID, value))) elif by XPATH: return wait.until(EC.presence_of_element_located((AppiumBy.XPATH, value))) elif by TEXT: return wait.until(EC.presence_of_element_located((AppiumBy.ANDROID_UIAUTOMATOR, fnew UiSelector().text({value})))) # ... 其他定位方式 except: continue raise NoSuchElementException(f所有定位策略都失败了: {locators}) # 使用示例 send_btn find_element_safely(driver, [ (ID, com.tencent.mm:id/aur), # 首选ID (TEXT, 发送), # 备选文本 ])6.2 异常处理与日志记录没有异常处理的脚本是脆弱的。必须用try...except包裹可能失败的操作。import logging logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s) def safe_click(element, description): 安全的点击操作包含重试机制 for i in range(3): # 重试3次 try: element.click() logging.info(f点击成功: {description}) return True except Exception as e: logging.warning(f第{i1}次点击失败[{description}]: {e}) time.sleep(1) # 等待1秒后重试 logging.error(f点击最终失败: {description}) return False同时在关键步骤前后进行截图对于后期排查问题有奇效。def take_screenshot(driver, name_prefix): timestamp time.strftime(%Y%m%d_%H%M%S) filename f{name_prefix}_{timestamp}.png driver.save_screenshot(filename) logging.info(f已保存截图: {filename})6.3 如何应对微信更新与界面变化这是自动化脚本的终极挑战。没有一劳永逸的方案但可以建立应对机制关键元素属性池将所有的定位符ID、文本等提取到配置文件如config.yaml或locators.py中而不是硬编码在脚本里。界面变化时只需更新配置文件。定期巡检脚本建立一个简单的“心跳脚本”每天定时运行核心流程如打开与文件传输助手的聊天窗口并发送一条测试消息。一旦失败立即通过邮件或消息通知你。图像识别作为后备对于变化极其频繁且无法通过属性定位的元素可以考虑引入图像识别库如opencv-python、airtest的图像匹配作为属性定位失败后的备用方案。但这会大幅增加复杂度和运行时间。6.4 在无界面服务器上运行可选如果你希望脚本在云服务器上24小时运行你需要处理无真实屏幕的问题。对于Android可以使用adb shell wm size设置一个虚拟分辨率并使用scrcpy或VNC来虚拟一个显示但这通常需要GPU支持。更常见的做法是使用安卓模拟器如Genymotion、Android Studio AVD并在服务器上以headless模式运行但模拟器运行微信可能违反其使用条款且性能消耗大。对于个人学习和测试使用一台旧安卓手机作为专用自动化设备通过adb over WiFi连接是更稳定和合规的选择。7. 常见问题排查与经验实录这里记录了我过去实践中遇到的一些典型问题及解决方案希望能帮你快速排雷。7.1 连接与启动类问题问题1adb devices列表为空。检查1USB线是否完好换一根线试试。检查2手机是否开启了“USB调试”在开发者选项里确认。检查3连接电脑时手机屏幕是否弹出了“允许USB调试”的对话框务必点击“始终允许”。检查4电脑是否安装了该手机的USB驱动对于华为、小米等品牌可能需要去官网下载对应的手机助手或驱动。问题2Appium Server启动失败提示端口被占用。默认端口是4723。可以杀掉占用端口的进程或者更改Appium Server的启动端口。在Appium Desktop的设置中或命令行启动时指定端口appium -p 4724问题3脚本报错Unable to find a matching set of capabilities。检查desired_capabilities或Options的拼写是否正确特别是automationName和platformName。确保Appium Server安装了对应的驱动如uiautomator2。7.2 元素定位与操作类问题问题4明明用Inspector看到了元素脚本却找不到NoSuchElementException。原因1上下文不对。可能页面发生了切换比如从原生界面切换到了WebView小程序、公众号文章。需要使用driver.contexts和driver.switch_to.context来切换上下文。原因2元素在屏幕外或不可见。尝试滚动查找。使用UIAutomator2的滚动选择器driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, new UiScrollable(...).scrollIntoView(...))。原因3页面未加载完。增加显式等待而不是硬等待。原因4定位符变了。微信更新了。重新用Inspector捕获元素。问题5send_keys输入内容乱码或输入不上。对于中文输入确保电脑和手机的输入法设置。有时需要先点击输入框再用adb shell input text命令输入但这不是Appium方式。更可靠的方法是使用driver.set_clipboard_text复制文本到剪贴板然后在输入框执行长按-粘贴的操作。问题6脚本运行时手机屏幕一锁屏就失败了。在开发者选项中开启“保持唤醒状态”充电时屏幕常亮。在脚本中定期执行一个无害操作如获取当前页面源码来阻止锁屏。使用adb shell input keyevent KEYCODE_WAKEUP命令唤醒屏幕需要脚本有执行adb命令的权限。7.3 稳定性与性能问题问题7脚本运行一段时间后变慢或卡死。检查是否有内存泄漏。确保每次脚本运行结束后都调用了driver.quit()。对于长时间运行的脚本可以定期重启App或Driver会话。清理微信缓存需谨慎noReset要设为False。问题8如何同时控制多台手机每台手机需要一个独立的deviceName(序列号)。为每台手机启动一个独立的Appium Server实例并监听不同的端口如4723 4724 4725...。在你的Python脚本中创建多个webdriver.Remote实例分别连接到不同的端口。最后我必须强调自动化操作微信应严格遵守微信的用户协议仅用于个人学习、测试或经授权的合法用途切勿用于任何骚扰、 spam 或违反法律法规的活动。技术的价值在于提升效率而非制造麻烦。希望这篇超详细的指南能成为你探索移动端自动化世界的一块坚实跳板。在实际操作中耐心和细致的调试永远是成功的关键遇到问题时多使用driver.page_source打印当前页面结构多用截图功能保存现场你会发现大部分难题都能迎刃而解。