如何实现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
相关产品推荐
相关产品推荐

