Selenium批量发WhatsApp消息遇无效号码报错如何跳过不中断
解决方案
程序崩溃的核心原因是访问未注册WhatsApp的号码链接时,页面不会加载聊天输入框,直接调用find_element查找目标元素会触发NoSuchElementException,且没有异常捕获逻辑导致整个循环终止。通过异常捕获+显式等待判断页面状态即可实现无效号码自动跳过,不中断全量发送流程。
第一步:补全需要导入的依赖
首先确保导入Selenium的等待模块和对应的异常类:
import time import pandas as pd 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.common.exceptions import NoSuchElementException, TimeoutException
第二步:修改消息发送函数
核心改动点:
- 用
try-except块包裹单条号码的发送逻辑,捕获元素不存在、等待超时两类异常 - 用显式等待替代固定时长的
time.sleep(),既减少无效等待时间,也能准确判断聊天窗口是否加载完成 - 触发异常时打印失败日志,自动跳过当前号码进入下一轮循环
- 可选增加无效号码弹窗的关闭逻辑,避免弹窗残留影响后续页面操作
修改后的完整函数代码:
def enviar_mensagem(nav): # 读取Excel中预拼接的WhatsApp链接 mailing = pd.read_excel('mailing.xlsx') # 统一定位器,后续维护只需要改这一处 INPUT_BOX_LOCATOR = (By.XPATH, '//footer//div[@contenteditable="true"]') INVALID_NUM_CONFIRM_BTN_LOCATOR = (By.XPATH, '/html/body/div[1]/div/span[2]/div/span/div/div/div/div/div/div[2]/div/div/div/div') for idx, url in enumerate(mailing['Concat2']): print(f"正在处理第{idx+1}/{len(mailing)}条:{url}") nav.get(url) find_elements_side(nav) try: # 最多等待10秒,直到消息输入框加载完成,超时直接判定为无效号码 input_box = WebDriverWait(nav, 10).until( EC.presence_of_element_located(INPUT_BOX_LOCATOR) ) # 输入框存在,执行发送操作 input_box.send_keys(Keys.ENTER) time.sleep(2) print(f"第{idx+1}条消息发送成功") except (NoSuchElementException, TimeoutException): print(f"第{idx+1}条对应号码未注册WhatsApp,跳过") # 尝试关闭无效号码的提示弹窗,找不到弹窗就直接跳过 try: nav.find_element(*INVALID_NUM_CONFIRM_BTN_LOCATOR).click() time.sleep(0.5) except NoSuchElementException: pass continue
额外优化建议
- 原代码使用的绝对路径XPath稳定性极差,WhatsApp前端迭代后很容易失效,上面代码里替换成了基于footer标签和contenteditable属性的相对定位,适配性更强
- 建议增加发送结果记录逻辑,把每条号码的发送状态(成功/无效/发送失败)写回Excel表格,任务跑完后可以直接导出无效号码清单
- 如果批量发送量较大,可以在每发送20-30条后增加3-5秒的随机等待,避免触发WhatsApp的反爬风控导致账号被限制
内容的提问来源于stack exchange,提问作者Bruno Couto
相关产品推荐
相关产品推荐

