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

Python Selenium操作WhatsApp发消息时内容重复、emoji乱码问题

问题根因

两个异常均为代码逻辑缺陷导致,不存在环境或第三方依赖兼容问题:

  1. 内容重复录入:代码执行了两次全量输入操作——先通过for ch in message逐字符调用send_keys输入完整消息,后续又执行Ctrl+V粘贴了提前用pyperclip复制到剪贴板的完整消息,两次内容叠加就出现了重复。
  2. Emoji显示乱码:emoji属于多码位Unicode字符,在Python字符串遍历、Selenium逐字符调用send_keys的过程中,会把emoji对应的UTF-16代理对拆成两个无效半字符,浏览器无法识别拆分后的内容,就会显示为�。

另外原有代码存在定位器不稳定的隐患:写死的全路径XPath、动态class名定位,只要WhatsApp前端版本更新、DOM结构小幅调整就会直接定位失败。

修复方案

直接移除逐字符输入的冗余逻辑,用一次性剪贴板粘贴的方式完成输入,同时替换不稳定的元素定位器,修复后代码如下:

import time
import pyperclip
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

def send_unsaved_contact_message():
    global message, browser
    try:
        # 等待输入框可交互,替换原有的硬等待、仅判断元素存在的逻辑
        input_box = WebDriverWait(browser, 20).until(EC.element_to_be_clickable((
            By.CSS_SELECTOR, "div[contenteditable='true'][data-tab='10']"
        )))
        # 清空输入框残留内容
        input_box.clear()
        # 将包含emoji、换行的完整消息复制到剪贴板
        pyperclip.copy(message)
        # 聚焦输入框后一次性粘贴内容,原生支持emoji、换行格式
        input_box.click()
        ActionChains(browser).key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform()
        # 用官方测试属性定位发送按钮,不受前端class、DOM层级变动影响
        send_btn = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((
            By.CSS_SELECTOR, "button[data-testid='compose-btn-send']"
        )))
        send_btn.click()
        # 留短暂间隔等待消息发送完成,避免切页导致发送中断
        time.sleep(1)
    except Exception as e:
        print("发送消息失败,异常信息:", e)
        return
修复点说明
  • 彻底删除逐字符遍历输入的逻辑,从根源解决重复输入、emoji被拆分导致乱码的问题
  • 替换动态class、绝对XPath定位方式,用WhatsApp前端固定的contenteditable属性、data-tab属性定位输入框,用data-testid定位发送按钮,适配前端版本更新
  • 把元素等待条件从「元素存在于DOM」调整为「元素可点击」,避免元素还未加载完成就操作触发的异常
  • 移除逐字符判断换行的冗余处理,剪贴板粘贴原生保留换行格式,输入效率比逐字符输入高90%以上
  • 跨系统适配提示:如果运行环境是MacOS,将粘贴操作的Keys.CONTROL替换为Keys.COMMAND即可正常触发粘贴

内容的提问来源于stack exchange,提问作者saghar ganji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:39:21