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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:40:43