使用Python+Selenium实现Facebook好友消息发送的问题排查
解决Facebook消息输入框定位失败的问题
看起来你遇到的核心问题是CSS选择器过时加上没有等待元素完全加载导致的NoSuchElementException,Facebook的UI结构经常更新,旧的选择器很容易失效,我来帮你修正这个问题:
问题分析
- 你的原选择器
div textarea.uiTextareaNoResize已经不符合当前Facebook消息页面的结构了——现在FB的消息输入框大多使用contenteditable的div而非传统的textarea,类名也早就更新了。 - 页面跳转后直接查找元素,没有等待页面渲染完成,元素还没出现在DOM里就触发查找,自然会报错。
修正方案
1. 引入显式等待机制
用Selenium的WebDriverWait等待元素加载完成,避免因页面渲染延迟导致的元素找不到问题。
2. 使用当前有效的选择器
针对Facebook最新的消息输入框结构,我们可以用属性选择器定位到正确的输入元素。
修改后的完整代码
from selenium import webdriver 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.webdriver.common.by import By driver = webdriver.Chrome('C:\path\chromedriver.exe') driver.get('https://www.facebook.com/') # 登录部分 username_box = driver.find_element_by_id('email') username_box.send_keys(USEREMAIL) passElem = driver.find_element_by_id("pass") passElem.send_keys(USERPASSWORD) passElem.send_keys(Keys.RETURN) # 进入目标用户对话页 userTargetUrl = "https://www.facebook.com/messages/t/" + "USERTAGET" driver.get(userTargetUrl) # 等待消息输入框加载(关键修正) wait = WebDriverWait(driver, 15) # 最多等待15秒 # 定位当前FB消息输入框:带有textbox角色且可编辑的div elem = wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, 'div[role="textbox"][contenteditable="true"]') )) # 发送消息循环 while True: elem.send_keys("Test") elem.send_keys(Keys.RETURN) # 按回车发送,部分情况下可能需要点击发送按钮 # 如果回车发送无效,替换成下面的代码定位发送按钮: # send_btn = wait.until(EC.element_to_be_clickable( # (By.CSS_SELECTOR, 'div[aria-label="Send"]') # )) # send_btn.click()
额外注意事项
- 如果你的Chrome版本和chromedriver版本不匹配,也可能导致元素定位异常,建议保持两者版本一致(你的chromedriver是2.35,对应Chrome60-62,但你用的是Chrome63,最好升级chromedriver到对应版本)。
- Facebook有反爬机制,频繁发送消息可能会触发验证码或账号限制,建议添加适当的延迟(比如
time.sleep(2))避免被检测。
内容的提问来源于stack exchange,提问作者raxor3k
相关产品推荐
相关产品推荐

