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

Python使用Chrome Driver发WhatsApp消息报NoSuchElementException错误如何解决

问题排查与解决方案

核心报错原因

  • 未预留页面加载时间:调用driver.get打开WhatsApp Web页面后,首先需要加载登录二维码,即使此前有登录缓存,聊天窗口的DOM元素渲染也需要时间,你在页面跳转后立刻查找附件按钮,此时元素还未渲染到DOM树中,自然会抛出NoSuchElementException。
  • 硬等待稳定性差:你后续代码里的sleep是固定时长,受网络波动、设备性能影响很容易出现等待时长不足的问题,推荐使用Selenium自带的显式等待方案。
  • 定位方法存在版本兼容风险:你使用的find_element_by_xpath是Selenium 3.x的旧API,在Selenium 4.0+版本中已经被正式移除,建议统一使用新的定位写法。
  • 附带的USB设备报错是Chrome浏览器的设备检测日志,和本次元素定位失败的问题无关,不需要额外处理。

修复后可运行代码

from selenium import webdriver
import os
from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

phnno = "91xxxxxxxxxx"
# 启动Chrome时保留缓存,避免每次都要扫码登录
options = webdriver.ChromeOptions()
options.add_argument(f"user-data-dir={os.getcwd()}/chrome_cache")

driver = webdriver.Chrome(executable_path=f"{os.getcwd()}\\chromedriver.exe", options=options)
driver.get(f"https://web.whatsapp.com/send?phone={phnno}&text&app_absent=0") 

# 显式等待最多30秒,直到附件按钮加载完成
wait = WebDriverWait(driver, 30)
attachbutt = wait.until(EC.presence_of_element_located((By.XPATH, '//span[@data-icon="clip"]')))
attachbutt.click()

forpdf = wait.until(EC.presence_of_element_located((By.XPATH, '//input[@accept="*"]')))
path = r"C:\Users\Deven\Desktop\test_file.pdf" # 原始字符串避免转义问题
forpdf.send_keys(path)

# 等待上传完成后再点击发送
sendbutt = wait.until(EC.element_to_be_clickable((By.XPATH, '//span[@data-icon="send"]')))
sleep(2)
sendbutt.click()

# 运行完成后关闭浏览器
sleep(5)
driver.quit()

额外注意事项

  • 第一次运行代码时会打开WhatsApp Web登录页,请在30秒的等待窗口内完成扫码登录,后续启动时Chrome会自动读取缓存的登录状态,不需要重复扫码。
  • 如果后续仍然出现定位失败的问题,可以手动打开WhatsApp Web的聊天窗口,右键点击附件按钮选择「检查」,确认对应span标签的data-icon属性是否有更新,替换代码中的对应属性值即可。

内容的提问来源于stack exchange,提问作者Deven Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 15:45:09