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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:18:24