Selenium报错AttributeError: 'WebDriver'对象无'driver'属性求助
问题分析与解决
错误含义
AttributeError: 'WebDriver' object has no attribute 'driver' 表示你试图访问一个WebDriver对象的driver属性,但该属性并不存在于WebDriver类中。
错误原因
你在run.py里直接通过LogIn类调用了choose_method方法,但choose_method是实例方法——这类方法必须通过类的实例来调用,第一个参数self会自动绑定到实例对象。你现在把browser(即WebDriver对象)作为第一个参数传入,导致方法里的self变成了WebDriver对象,而WebDriver并没有driver属性,因此触发报错。
解决方案
方案1:先实例化LogIn类,再调用方法(推荐)
修改run.py中的代码,先创建LogIn的实例,再通过实例调用方法:
def run(): browser = init_driver(C.url) # 先创建LogIn实例,传入driver对象 login_handler = LogIn(browser) # 通过实例调用choose_method方法 login_handler.choose_method(By.CSS_SELECTOR, '#credentialSignin')
方案2:将choose_method改为类方法/静态方法
如果你的LogIn类不需要维护实例状态,可以把choose_method改成类方法,这样就能直接通过类调用:
修改helpers.py:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class LogIn: @classmethod def choose_method(cls, driver, method, locator): WebDriverWait(driver,10).until(EC.visibility_of_element_located((method,locator))).click()
这种情况下run.py里的调用代码不需要修改,同时可以删掉__init__方法,因为类方法不需要实例属性。
额外优化建议
你的ChromeBrowser.py里使用了全局driver变量,可能会导致潜在的资源泄漏或冲突问题,建议把driver的创建逻辑放到init_driver函数内部:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager def init_driver(url): options = webdriver.ChromeOptions() options.add_experimental_option("detach", True) options.add_argument("disable-infobars") driver = webdriver.Chrome(options=options, service=Service(ChromeDriverManager().install())) driver.get(url) return driver
内容的提问来源于stack exchange,提问作者XXX
相关产品推荐
相关产品推荐

