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

Selenium使用lambda定义Firefox驱动时报function对象无get属性错误求助

错误根因分析
  • 核心错误:你将self.driver赋值为未调用的lambda函数,而非webdriver实例对象,调用get方法时自然会抛出函数对象无该属性的异常。
  • 其他连带问题:
    1. login方法缩进错误,被定义在__init__构造函数内部,属于局部函数,无法作为类方法被外部调用
    2. self.comentario赋值时末尾拼接了, self.discord,最终为元组类型而非字符串,后续输入到文本框会报错
    3. 给登录输入框传值时直接传递StringVar对象,没有调用.get()方法获取实际输入的文本
    4. 代码中使用的find_element_by_css_selector为Selenium高版本已废弃的语法
修复方案
  1. 去掉lambda写法,点击登录后再实例化webdriver,避免程序启动时就打开闲置浏览器
  2. 调整login方法的缩进,使其成为Bot类的公共成员方法
  3. 修正self.comentario的字符串拼接逻辑,统一为字符串类型
  4. 所有StringVar取值都调用.get()方法,废弃的Selenium语法替换为标准的find_element写法
修复后完整可运行代码
from tkinter import *
from tkinter import ttk
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.common.keys import Keys
import time


class Bot(object):
    def __init__(self, master):
        # 类作用域变量定义
        self.username = StringVar()
        self.password = StringVar()
        self.discord = StringVar()
        self.s = Service("./driver/geckodriver.exe")
        # 驱动初始化为空,点击登录后再实例化
        self.driver = None

        # 登录界面frame创建
        loginFrame = ttk.Frame(master, padding=10)
        loginFrame.grid()

        # 用户名输入组件
        self.labelUsername = Label(loginFrame, bg='#CCCCCC', text="Usuário")
        self.labelUsername.pack()
        self.textoUsername = Entry(loginFrame, textvariable=self.username)
        self.textoUsername.pack()
        self.textoUsername.bind("<Return>", lambda x: self.username)

        # 密码输入组件
        self.labelPassword = Label(loginFrame, bg='#CCCCCC', text="Senha")
        self.labelPassword.pack()
        self.textoPassword = Entry(loginFrame, textvariable=self.password, show="*")
        self.textoPassword.pack()
        self.textoPassword.bind("<Return>", lambda x: self.password)

        # Discord链接输入组件
        self.labelDiscord = Label(loginFrame, bg='#CCCCCC', text="Link Discord")
        self.labelDiscord.pack()
        self.textoDiscord = Entry(loginFrame, textvariable=self.discord)
        self.textoDiscord.pack()
        self.textoDiscord.bind("<Return>", lambda x: self.discord)

        # 登录按钮
        ttk.Button(master, text="Login", command=lambda: self.prituserpasswd()).grid(column=1, row=0)

    def login(self):
        # 点击登录后才启动浏览器
        self.driver = webdriver.Firefox(service=self.s)
        driver = self.driver
        driver.get("https://playerlink.gg/login")
        time.sleep(3)
        # 用户名输入,调用get()获取实际输入值
        campo_usuario = driver.find_element(By.XPATH, "//input[@name='email']")
        campo_usuario.click()
        campo_usuario.clear()
        campo_usuario.send_keys(self.username.get())
        # 密码输入
        campo_senha = driver.find_element(By.XPATH, "//input[@name='password']")
        campo_senha.click()
        campo_senha.clear()
        campo_senha.send_keys(self.password.get())
        campo_senha.send_keys(Keys.RETURN)
        time.sleep(15)
        self.comentar()

    def comentar(self):
        driver = self.driver
        driver.get("https://playerlink.gg/network")
        time.sleep(5)
        link = ""
        while True:
            # 替换废弃的旧版元素定位语法
            campo_comentario = driver.find_element(By.CSS_SELECTOR, "div[class='mb-4']")
            perfil = campo_comentario.find_element(By.CSS_SELECTOR, "a")
            linkPerfil = perfil.get_attribute("href")
            if link != linkPerfil:
                post = campo_comentario.find_element(By.CSS_SELECTOR, "textarea")
                # 动态拼接最新输入的Discord链接到评论内容
                comentario = f"𝔼𝕃𝕆𝕆 𝕁𝕆𝕆𝔹 ℍ𝕆ℝ𝕌𝕌𝕊𝕊 \n \n 𝔼𝕃00𝕆𝔹00𝕆𝕊𝕋 \n 𝔻𝕌𝕆𝔹𝕆0𝕆0𝕊𝕋 \n ℂ𝕆0𝔸ℂℍ𝕀ℕ𝔾 \n ℂ𝕆𝕆ℕ𝕋𝔸𝔸$ 𝕊𝕄U𝕌𝕌ℝ𝔽: 5,5 R$ \n \n DISCOR: \n{self.discord.get()}"
                post.send_keys(comentario)
                post.send_keys(Keys.RETURN)
                link = linkPerfil
            time.sleep(0.01)

    def prituserpasswd(self):
        print('Usuário: ', self.username.get())
        print('Senha: ', self.password.get())
        print('Discord: ', self.discord.get())
        self.login()


root = Tk()
root.title('Print usuário e senha')
Bot(root)
root.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:06:07