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

使用Selenium Python Chrome WebDriver发推特遇NoSuchElementException求助

解决Selenium定位Twitter元素时的NoSuchElement异常问题

看起来你遇到的NoSuchElement异常,大概率是两个核心问题导致的——页面元素还没加载完成就去查找,或者元素选择器使用不正确。咱们一步步来解决:

1. 核心问题分析

(1)缺失显式等待机制

Twitter登录页面是动态渲染的,直接调用find_element_by_xxx会在元素还没加载完成时执行,自然找不到目标元素,抛出异常。

(2)提交按钮的选择器错误

你写的"submit EdgeButton EdgeButton--primary EdgeButtom--medium"是多个类名,但find_element_by_class_name仅支持单个类名;另外你还拼写错误了EdgeButtom(正确是EdgeButton),就算拼写正确,多类名也不能直接用这个方法定位。

(3)Python版本语法问题

你的代码里print "Tweet probably sent"是Python 2的写法,若使用Python 3会报错,需改为带括号的print("Tweet probably sent")。

2. 修正后的完整代码

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
import os

chromedriver = "mypathto/chromedriver"
os.environ["webdriver.chrome.driver"] = chromedriver
driver = webdriver.Chrome(chromedriver)
driver.get('https://twitter.com/login')

try:
    # 显式等待用户名输入框加载并可交互
    username = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.NAME, "session[username_or_email]"))
    )
    username.send_keys("myusername")

    # 等待密码输入框
    password = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.NAME, "session[password]"))
    )
    password.send_keys("password")

    # 用CSS选择器定位提交按钮(修复类名拼写+多类选择)
    submit = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, "button.submit.EdgeButton.EdgeButton--primary.EdgeButton--medium"))
    )
    submit.click()

    # 等待推文输入框加载完成
    autotw1 = WebDriverWait(driver, 15).until(
        EC.element_to_be_clickable((By.ID, 'tweet-box-home-timeline'))
    )
    autotw1.send_keys("Just a testing")
    
    # 可选:定位并点击发送推文的按钮
    # tweet_submit = WebDriverWait(driver, 10).until(
    #     EC.element_to_be_clickable((By.CSS_SELECTOR, "button.tweet-action"))
    # )
    # tweet_submit.click()

    print("Tweet probably sent")
    driver.save_screenshot("mybotfunc.png")
except Exception as e:
    print(f"出错了: {str(e)}")
    driver.save_screenshot("error.png")
finally:
    # 确保浏览器最终关闭
    driver.quit()

3. 额外注意事项

  • WebDriverWait配合expected_conditions是处理动态页面的最优方案,比time.sleep()更高效,它会在元素加载完成后立即执行操作,无需固定等待时长。
  • 如果发现session[username_or_email]这类属性找不到,说明Twitter可能更新了页面结构,你可以通过浏览器开发者工具(F12)重新查看元素属性,改用XPATH或CSS选择器定位。
  • Twitter有反自动化机制,频繁操作可能触发人机验证,这种情况需要额外处理(比如使用代理、手动验证等),这属于进阶的反爬规避范畴。

内容的提问来源于stack exchange,提问作者Sarvesh EB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:16:43