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

使用find_element("xpath",...)无法定位WhatsApp联系人元素求助

解决WhatsApp机器人无法定位联系人的问题

问题根源

你的代码出现元素找不到的错误,主要由以下问题导致:

  • 未导入By类,导致By.CLASS_NAME调用失败
  • 固定等待时间不可靠,页面未完全加载就执行元素查找
  • WhatsApp Web页面元素结构可能更新,原定位方式失效
  • ChromeDriver参数使用过时,且版本可能与浏览器不兼容

修复方案

1. 补充必要模块导入

添加By类和显式等待相关模块,替代不稳定的固定等待:

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

2. 替换固定等待为显式等待

显式等待会等待目标元素加载完成后再执行操作,比time.sleep()更稳定:

# 等待聊天面板加载(预留扫码时间)
WebDriverWait(self.driver, 60).until(
    EC.presence_of_element_located((By.ID, "pane-side"))
)

3. 更新元素定位逻辑

通过搜索框定位联系人更可靠,避免因联系人不在可见列表导致的查找失败:

# 点击搜索框并输入联系人名称
search_box = WebDriverWait(self.driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//div[@contenteditable='true' and @data-tab='3']"))
)
search_box.click()
search_box.clear()
search_box.send_keys(grupo_ou_pessoa)

# 等待联系人元素出现并点击
contact = WebDriverWait(self.driver, 10).until(
    EC.presence_of_element_located((By.XPATH, f"//span[@title='{grupo_ou_pessoa}']"))
)
contact.click()

4. 修复ChromeDriver参数

新版Selenium中chrome_options已替换为options参数,同时确保ChromeDriver版本与浏览器一致:

self.driver = webdriver.Chrome(options=options)

修改后的完整代码

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

class WhatsappBot:
    def __init__(self):
        self.mensagem = "test"
        self.grupos_ou_pessoas = ["Mae"]
        options = webdriver.ChromeOptions()
        options.add_argument('lang=pt-br')
        # 若已配置ChromeDriver环境变量,可省略executable_path参数
        self.driver = webdriver.Chrome(options=options)

    def EnviarMensagens(self):
        self.driver.get('https://web.whatsapp.com')
        # 等待聊天面板加载(给足够时间扫码登录)
        WebDriverWait(self.driver, 60).until(
            EC.presence_of_element_located((By.ID, "pane-side"))
        )
        
        for grupo_ou_pessoa in self.grupos_ou_pessoas:
            # 定位搜索框并输入联系人名称
            search_box = WebDriverWait(self.driver, 10).until(
                EC.presence_of_element_located((By.XPATH, "//div[@contenteditable='true' and @data-tab='3']"))
            )
            search_box.click()
            search_box.clear()
            search_box.send_keys(grupo_ou_pessoa)
            
            # 等待联系人出现并点击进入聊天
            contact = WebDriverWait(self.driver, 10).until(
                EC.presence_of_element_located((By.XPATH, f"//span[@title='{grupo_ou_pessoa}']"))
            )
            contact.click()
            
            # 定位聊天输入框并发送消息
            chat_box = WebDriverWait(self.driver, 10).until(
                EC.presence_of_element_located((By.XPATH, "//div[@contenteditable='true' and @data-tab='1']"))
            )
            chat_box.send_keys(self.mensagem)
            
            # 点击发送按钮
            botao_enviar = WebDriverWait(self.driver, 10).until(
                EC.presence_of_element_located((By.XPATH, "//span[@data-icon='send']"))
            )
            botao_enviar.click()
            time.sleep(2)  # 短暂等待消息发送完成

bot = WhatsappBot()
bot.EnviarMensagens()

额外注意事项

  • 确保ChromeDriver版本与你的Chrome浏览器版本完全匹配,可从Chrome官方渠道下载对应版本
  • 联系人名称必须与WhatsApp中显示的完全一致(包括大小写、空格、特殊字符)
  • 若仍无法定位元素,可右键目标元素选择「检查」,查看最新HTML结构后调整XPath表达式

内容的提问来源于stack exchange,提问作者Rafa Sousa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:44:56