Python Selenium自动化发送WhatsApp消息仅发送部分内容
问题根因
最后一行消息丢失本质是操作时序不匹配:
- WhatsApp Web的输入框不是原生input/textarea,是带
contenteditable属性的自定义DIV。执行Ctrl+V粘贴多行内容时,浏览器要把换行解析成对应的DOM节点(一般是嵌套div或br标签)逐行插入,这个渲染过程是异步的,不是粘贴快捷键执行完就立刻完成的。 - 你的代码在触发粘贴动作后没有等内容完全写入输入框,马上用JS强制触发发送按钮点击,此时最后一行还没完成DOM插入,自然就被截断只发出去前半部分。
- 还有个隐藏问题:你之前用
presence_of_element_located定位输入框,只能保证元素在DOM树里存在,不能保证它已经可以聚焦、可以输入,也会提升粘贴异常的概率。
修复方案
核心是不要靠猜固定时长等操作,用显式等待确认每一步操作实际生效了再走下一步:
- 定位输入框时改用
element_to_be_clickable判断条件,确保元素处于可交互状态,粘贴前先点击聚焦输入框,避免粘贴失效 - 粘贴完成后加校验逻辑,等输入框里的实际文本和你要发的消息完全一致,再去找发送按钮,不要用固定sleep,不同内容长度、设备性能下渲染时间差异很大,固定等待要么浪费时间要么还是会出现截断
- 尽量不要用JS强制触发点击,等发送按钮可点击后用原生click方法触发,避免绕过页面本身的状态校验
修正后的代码如下:
def send_unsaved_contact_message(): global message try: time.sleep(10) pyperclip.copy(message) # 等待输入框可交互 input_box = wait.until(EC.element_to_be_clickable((By.XPATH, "(//div[@title='Type a message'])[1]" ))) input_box.click() # 先聚焦输入框 # 执行粘贴 action.key_down(Keys.CONTROL).send_keys("v").key_up(Keys.CONTROL).perform() # 等待内容完全填充到输入框,最长等待10秒 wait.until(lambda _: input_box.text.rstrip() == message.rstrip()) # 等待发送按钮可点击后触发发送 whatsapp_send_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//span[contains(@data-icon,'send')]" ))) whatsapp_send_button.click() except Exception as e: print("Failed to send message exception: ", e) return
如果遇到消息末尾带特殊字符、表情的情况,文本匹配规则可以按需调整,比如改成判断待发送内容是输入框文本的前缀、或者去掉不可见字符后再比对,避免因为格式字符导致等待超时。
内容的提问来源于stack exchange,提问作者setareh ganji
相关产品推荐
相关产品推荐

