Selenium使用lambda定义Firefox驱动时报function对象无get属性错误求助
错误根因分析
- 核心错误:你将
self.driver赋值为未调用的lambda函数,而非webdriver实例对象,调用get方法时自然会抛出函数对象无该属性的异常。 - 其他连带问题:
login方法缩进错误,被定义在__init__构造函数内部,属于局部函数,无法作为类方法被外部调用self.comentario赋值时末尾拼接了, self.discord,最终为元组类型而非字符串,后续输入到文本框会报错- 给登录输入框传值时直接传递
StringVar对象,没有调用.get()方法获取实际输入的文本 - 代码中使用的
find_element_by_css_selector为Selenium高版本已废弃的语法
修复方案
- 去掉lambda写法,点击登录后再实例化webdriver,避免程序启动时就打开闲置浏览器
- 调整
login方法的缩进,使其成为Bot类的公共成员方法 - 修正
self.comentario的字符串拼接逻辑,统一为字符串类型 - 所有
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
相关产品推荐
相关产品推荐

