Python Selenium操作WhatsApp发消息时内容重复、emoji乱码问题
问题根因
两个异常均为代码逻辑缺陷导致,不存在环境或第三方依赖兼容问题:
- 内容重复录入:代码执行了两次全量输入操作——先通过
for ch in message逐字符调用send_keys输入完整消息,后续又执行Ctrl+V粘贴了提前用pyperclip复制到剪贴板的完整消息,两次内容叠加就出现了重复。 - 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
相关产品推荐
相关产品推荐

