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

如何实现Python Selenium自定义元素类可调用 解决NoneType不可调用报错

报错原因

你实现的ButtonElementAndWaitNewElement用了Python描述符协议,__get__方法会在你访问实例的timesheet_from_3_weeks_ago属性时自动触发,你的__get__方法没有显式指定返回值,默认返回None。你在测试用例中给属性加了括号,相当于尝试调用返回的None,所以触发TypeError: 'NoneType' object is not callable报错。你观察到的点击和等待逻辑正常执行,就是__get__被自动触发的证明。

解决方案

有两种可选方案,按需选择即可:

方案1:修改测试用例调用方式(改动最小)

直接删除调用时的括号,访问属性就会自动执行逻辑,测试代码修改为:

self.worker_time_page.timesheet_from_3_weeks_ago

无需修改其他封装代码,修改后直接生效。

方案2:修改描述符实现,保留带括号调用习惯

如果希望保持调用方法的写法,修改ButtonElementAndWaitNewElement的__get__方法,返回一个封装了执行逻辑的可调用对象:

class ButtonElementAndWaitNewElement(BaseElement):
   def __init__(self, locator, element_to_appear_path):
        super(ButtonElementAndWaitNewElement, self).__init__(locator)
        self.element_to_appear_path = element_to_appear_path

   def __get__(self, obj, owner):
       def run_click_and_wait():
           driver = obj.driver
           element = WebDriverWait(driver, 30).until(
               EC.element_to_be_clickable(self.locator))
           element.click()
           WebDriverWait(driver, 30).until(
               EC.presence_of_element_located(self.element_to_appear_path))
       return run_click_and_wait

修改后原来的带括号调用代码可以正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:06:03