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

使用Selenium/Firefox登录Twitter成功但WebDriver报错(Python)

问题描述

执行以下Twitter登录自动化代码时,明明页面已跳转到输入密码的阶段,且用户名已正确输入,但无论是按回车还是点击按钮,Python都会抛出找不到元素的错误。使用XPath定位元素(本人非前端开发,可能定位有误)。

代码片段

SEL_DRIVER = webdriver.Firefox(service=Service(GeckoDriverManager().install()))

class TwitterBot():
    def __init__(self,username,password):
        self.browser=SEL_DRIVER
        self.username=username
        self.password=password
        
    def signIn(self):
        self.browser.get("https://www.twitter.com/login")
        # time.sleep(2)
        # usernameInput=self.browser.find_element_by_name("session[username_or_email]")
        # usernameInput=self.browser.find_element(by = By.XPATH,
                                                # value= '''/html/body/div/div/div/div[1]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[5]/label/div/div[2]/div/input''')
        
        wait = WebDriverWait(self.browser, 30)
        usernameInput = wait.until(EC.visibility_of_element_located((By.NAME, "text")))
        usernameInput.send_keys(self.username)
        
        input("Press Enter to continue...")
        
        # usernameInput.send_keys(Keys.ENTER) ### 无效,抛出错误
        
        usernameBtn=self.browser.find_element(by = By.XPATH,
                                              value= '''/html/body/div/div/div/div[1]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[6]/div''')        

        input("Press Enter...")
        usernameBtn.click() 
        .........

报错信息(Jupyter Notebook)

Cell In[3], line 32, in TwitterBot.signIn(self)
     29 usernameBtn.click()
...
RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:180:5
NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:392:5
element.find/<<@chrome://remote/content/marionette/element.sys.mjs:133:16

报错核心说明:NoSuchElementError(找不到元素错误),代码执行到usernameBtn.click()时,无法定位到指定XPath对应的元素。

解决方案

核心问题

你使用的是绝对XPath定位按钮,这种路径完全依赖页面DOM结构,只要Twitter更新布局、元素加载顺序变化就会失效;且输入用户名后页面会刷新/跳转,你直接定位按钮没有等待页面完成更新,导致元素未加载就执行查找操作。

具体修复步骤

  1. 替换绝对XPath为稳定的相对定位
    放弃从根节点开始的长XPath,改用元素的专属属性或文本定位,比如:

    • 按按钮文本定位:By.XPATH, "//div[contains(text(), '下一步')]"(根据界面语言调整,中文界面为“下一步”)
    • 按专属测试属性定位:By.CSS_SELECTOR, "[data-testid='LoginForm_Login_Button']"(data-testid属性一般不会轻易变更,稳定性更高)
  2. 添加显式等待,确保元素加载完成
    输入用户名后必须等待目标按钮可交互后再操作,不能直接查找元素。修改按钮定位代码为:

    next_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "[data-testid='LoginForm_Login_Button']")))
    next_btn.click()
    
  3. 简化回车键操作
    如果想用回车键代替点击,直接在输入用户名后执行:

    usernameInput.send_keys(Keys.ENTER)
    

    前提是确保输入框处于可交互状态,配合显式等待更稳妥:

    usernameInput = wait.until(EC.element_to_be_clickable((By.NAME, "text")))
    usernameInput.send_keys(self.username)
    usernameInput.send_keys(Keys.ENTER)
    
  4. 避免全局驱动实例
    全局的SEL_DRIVER会导致多次实例化TwitterBot时复用同一个浏览器,容易引发状态混乱。建议在类的初始化方法内创建驱动:

    def __init__(self,username,password):
        self.browser = webdriver.Firefox(service=Service(GeckoDriverManager().install()))
        self.username=username
        self.password=password
    

修复后的完整signIn方法示例

def signIn(self):
    self.browser.get("https://www.twitter.com/login")
    wait = WebDriverWait(self.browser, 30)
    
    # 等待用户名输入框可交互并输入内容
    usernameInput = wait.until(EC.element_to_be_clickable((By.NAME, "text")))
    usernameInput.send_keys(self.username)
    
    # 等待下一步按钮并点击
    next_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "[data-testid='LoginForm_Login_Button']")))
    next_btn.click()
    
    # 等待密码输入框并输入密码
    passwordInput = wait.until(EC.element_to_be_clickable((By.NAME, "password")))
    passwordInput.send_keys(self.password)
    passwordInput.send_keys(Keys.ENTER)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:27:45