使用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
相关产品推荐
相关产品推荐

