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
相关产品推荐
相关产品推荐

