使用Selenium调用函数时出现"'str' object is not callable"错误求助
解决你的Selenium Driver类"'str' object is not callable"错误
嘿,我来帮你拆解这个问题并给出修复方案!
错误根源分析
从你贴的代码来看,核心问题出在类属性的不当使用上:
- 你把
driver、WebDriverWait30Seconds这些对象定义成了类级属性,它们会在类被加载时就初始化,而且所有Driver实例会共享同一个driver和等待对象。这种设计很容易导致属性被意外覆盖——比如如果你的navigate方法(或者其他方法)不小心把WebDriverWait30Seconds赋值成了字符串,后续调用它的until()方法时,就会触发"'str' object is not callable"的错误。 - 另外,类共享driver实例本身就是个隐患,多次实例化Driver类会导致浏览器窗口混乱,甚至出现不可预期的崩溃。
修复后的完整代码
我们需要把driver和等待对象改成实例属性,确保每个Driver实例都有独立的资源,同时避免属性被误覆盖:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait class Driver(object): def __init__(self): # 初始化实例专属的driver self.driver = webdriver.Chrome(executable_path="C:\\Program Files\\Google\\Drive\\chromedriver.exe") # 基于当前实例的driver创建等待对象 self.wait_30s = WebDriverWait(self.driver, 30) self.wait_60s = WebDriverWait(self.driver, 60) self.wait_120s = WebDriverWait(self.driver, 120) def close(self): """关闭webdriver实例""" self.driver.quit() def navigate(self, url): # 完整实现导航方法,确保不会覆盖等待对象 self.driver.get(url)
额外优化建议
- 命名规范:改用小写加下划线的命名(比如
wait_30s),符合Python PEP8规范,也避免和内置名称冲突。 - 避免硬编码驱动路径:可以用
webdriver_manager库自动管理驱动,不用手动写路径:from webdriver_manager.chrome import ChromeDriverManager self.driver = webdriver.Chrome(ChromeDriverManager().install()) - 添加异常处理:在初始化和操作driver时捕获异常(比如驱动不存在、页面超时),让代码更健壮。
内容的提问来源于stack exchange,提问作者Dean Movy
相关产品推荐
相关产品推荐

