背景:因为selenium中抛出的异常信息繁多精简起来怕丢失重要信息 所以根据抛出异常对象类来自定义报错信息
解决方法:
isinstance()
函数用于检查一个对象是否属于指定的类或类型。
其语法如下:
isinstance(object, classinfo)
object
:要检查的对象。classinfo
:可以是类、类型或由类或类型组成的元组。如果object
是其中任何一个类或类型的实例,则返回True
;否则返回False
。
首先使用isinstance
方法来判断捕获的异常和预期的异常是否一直
isinstance(exception_error, (exceptions.TimeoutException, exceptions.NoSuchElementException))
但是上面的方法有个弊端 exceptions
模块里有大量的异常类 如果手动将类型加入到判断里面会造成代码冗余,所以使用后面用到dir
获取整个模块里的类,dir获取到的是字符串所以使用getattr得到类对象进行判断
print(isinstance(exception_error, tuple(getattr(exceptions, name) for name in dir(exceptions))))
但是这个也是有问题的dir是获取模块里的所有属性不全是类也包括一些字符串和其他类型对象 所以在构建元组或者调用getattr时会出错 即使不出错在 isinstance判断时也有可能出错,所以要在dir获取exceptions
属性时进行过滤只获取模块里的类对象,但是这样过滤比较麻烦,这里可以直接使用python内置的方法inspect来获取exceptions
模块的类对象
inspect.getmembers()
和 inspect.isclass()
是 Python 中的两个内置模块 inspect
中的方法,用于获取对象的成员信息并判断对象是否为类对象。
inspect.getmembers(object, [predicate])
:该方法返回一个由对象成员组成的列表,每个成员表示为一个元组
(name, value)
,其中name
是成员的名称,value
是成员的值。可选参数
predicate
是一个可调用的函数,用于过滤要获取的成员。如果提供了predicate
,则只有满足条件的成员才会被返回。如果没有提供
predicate
,则返回对象的所有成员。
inspect.isclass(object)
:该方法用于判断给定的对象是否是一个类对象。
如果对象是一个类对象,则返回
True
,否则返回False
。
print(isinstance(exception_error, tuple(member for name, member in inspect.getmembers(exceptions) if inspect.isclass(member))))
写法二
print(isinstance(exception_error, tuple(member[1] for member in inspect.getmembers(exceptions, lambda member: inspect.isclass(member))))) # 使用getmembers和isclass方法 优化后只是要getmembers方法
自定义方法
def istype_exception(error):
for i in dir(exceptions):
if type(error) is getattr(exceptions, i):
return i