Selenium WhatsApp自动化脚本运行抛出NoSuchElementException异常
报错核心诱因
- 缺失等待逻辑:打开WhatsApp Web后需要完成扫码登录、页面资源渲染,代码没有等待流程就直接执行元素定位,此时目标元素还未加载到DOM树中,哪怕选择器写对也会定位失败。
- 多类名定位方式错误:
By.CLASS_NAME定位方法仅支持传入单个类名,发送按钮的class属性是空格分隔的多类值,直接传入整串字符会导致定位逻辑失效。 - 元素查找顺序错误:代码在点击进入目标联系人聊天窗口之前,就提前查找消息输入框,此时当前页面未切换到对应聊天会话,输入框元素不存在。
- 废弃API调用:代码中使用的
find_element_by_class_name是Selenium旧版本API,新版本Selenium已完全移除该方法,运行时也会触发异常。
修复后可运行代码
修复逻辑对应上述问题:新增60秒显式等待覆盖扫码+页面加载时长、多类名元素改用CSS选择器定位、调整元素查找顺序、统一使用新版Selenium定位API:
from selenium import webdriver import time from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://web.whatsapp.com/') # 显式等待实例,最长等待60秒,预留足够时间完成扫码登录 wait = WebDriverWait(driver, 60) name = input('enter the name of user:') msg = input('enter your message:') count = int(input("enter the count:")) # 等待联系人列表加载完成后定位目标联系人 user = wait.until(EC.presence_of_element_located( (By.XPATH, f'//span[@title = "{name}"]') )) user.click() # 进入聊天窗口后再定位消息输入框 msg_box = wait.until(EC.presence_of_element_located( (By.CLASS_NAME, '_2lMWa') )) for i in range(count): msg_box.send_keys(msg) time.sleep(0.5) # 多类名转换为CSS选择器格式:每个类名前加.,类名之间的空格替换为. button = wait.until(EC.element_to_be_clickable( (By.CSS_SELECTOR, '.tvf2evcx.oq44ahr5.lb5m6g5c.svlsagor.p2rjqpw5.epia9gcq') )) button.click() time.sleep(1)
运行注意事项
启动代码后会自动唤起Chrome打开WhatsApp网页版,需在60秒内用手机端WhatsApp完成扫码登录,后续发消息流程会自动执行。如果后续WhatsApp前端迭代修改了元素类名,直接替换代码中对应的类名/XPath值即可,核心逻辑无需调整。
内容的提问来源于stack exchange,提问作者Princeofcoding
相关产品推荐
相关产品推荐

