我看过这个问题的常用搜索引擎。我有一种异常需要以不同的方式处理,因为不同的警告不是定期的,并且没有相同的文档布局,我已经自动化了一段时间的网站。 我正在使用的解决方案是在网站上显示警告时评论和解除部分代码。
它总是给我ElementNotVisibleException
,但是对于相同的错误有两个例外将不起作用,因为它将由第一个例外处理
While True:
try:
#some code
except ElementNotVisibleException:
#code to handle error1
except ElementNotVisibleException:
#code to handle error2 that will never be procesed
嵌套try...except
块似乎太令人讨厌了。因为当处理失败时,由于NoSuchElementException
的其他异常,并且仅使用except
似乎也不正确,因为它可以隐藏为什么失败的真正原因
While True:
try:
#some code
break
except ElementNotVisibleException:
try:
#code to handle error1
break
except:
#code to handle error2
所以,我的问题是,有没有其他方法可以处理多种方式的异常,一种更加pythonic的方式?
由于
编辑:进一步解释我打算做什么。
假设必须导航一些菜单,但在菜单出现之前会出现一些网站警报,在这种情况下我们会将其称为warning1,warning2和警告3.在这种情况下,脚本会因为警告而中断看不见这个菜单。
警告1:将有一个继续按钮并且在同一帧中。
警告2:将弹出一些带有复选框和按钮的叠加层(带有不同的占位符,id和xpath)
警告3:与warning1几乎相同,但具有不同的id,name和xpath。
但他们所有人都会抛出ElementNotVisibleException
。因此所有这些都不能以相同的方式处理,并且警告N可能会超时出现(这个脚本很旧,就像两岁)我并不想花太多时间在它上面因为我可能在我的职业生涯中远离这一点,并希望将其视为可以改变和明确的,对于将要采取立场的那个人来说。所以这个人可以添加一些代码来克服新的警告信息。
EDIT2:@JeffC的回答得到了正确的想法,并将其与@CoryKramer的This answer相结合,使其更适合我提出的新人:
def not_visible_handler():
ls_handlers = [warnin1_hanlder, warnin2_hanlder, warnin3_hanlder]
def warnin1_hanlder():
#code to handle warning 1
return True
def warnin2_hanlder():
#code to handle warning 2
return True
def warnin3_hanlder():
#code to handle warning 3
return True
for handler in ls_handlers:
if handler() is True:
break
else: #this else belongs to the for
raise Exception('No more Handlers for warning messages')
while True:
try:
#some code
break
except ElementNotVisibleException:
not_visible_handler()
它足够直接,因此它们不会触及实际工作代码,并且可以轻松添加更多处理程序。还可以将一点点工作变成一个模块。
Edit3:列表中函数的名称不能是字符串,否则您将获得TypeError: 'str' type is not callable
答案 0 :(得分:2)
我认为你真的不需要捕获多个异常。例外是相同的,原因是不同的。原因与存在哪种警告有关。我会捕获异常,然后继续确定哪个警告导致异常。您可以通过查找warning1,warning2和warning3标准的元素来完成此操作。一旦找到属于特定警告的元素,就可以处理它。下面的代码概述了这种方法。我不知道不同场景的定位器,因此您需要添加特定的find方法和定位器。
While True:
try:
#some code
except ElementNotVisibleException:
#code to handle warning1
if (len(driver.find_elements_by_*(warning1_locator)) > 0)
#handle warning1 case
#code to handle warning2
if (len(driver.find_elements_by_*(warning2_locator)) > 0)
#handle warning2 case
#code to handle warning3
if (len(driver.find_elements_by_*(warning3_locator)) > 0)
#handle warning3 case