关于selenium:Python – 以多种方式处理一个异常

Python - handle one exception in multiple ways

我看过这个问题的常用搜索引擎。我有一种异常需要以不同的方式处理,因为不同的警告不是定期的,并且没有相同的文档布局,我已经自动化了一段时间的网站。
我正在使用的解决方案是在网站上显示警告时评论和解除代码的某些部分。

它总是给我ElementNotVisibleException,但对于同一错误有两个例外将不起作用,因为它将由第一个例外处理

1
2
3
4
5
6
7
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似乎也不正确,因为它可以隐藏为什么失败的真正原因

1
2
3
4
5
6
7
8
9
10
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)

Warning3:将与warning1几乎相同,但具有不同的id,name和xpath。

但是所有这些都会抛出ElementNotVisibleException。因此所有这些都不能以相同的方式处理,并且警告N可能会超时出现(这个脚本很旧,就像两岁)我并不想花太多时间在它上面因为我可能在我的职业生涯中远离这一点,并希望将其视为可以改变和明确的,对于将要采取立场的那个人来说。所以这个人可以添加一些代码来克服新的警告信息。

编辑2:@JeffC的答案得到了正确的想法,并将其与@CoryKramer的这个答案相结合,使其更适合我提出的新人:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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


我认为你真的不需要捕获多个异常。 例外情况是一样的,原因是不同的。 原因与存在哪种警告有关。 我会捕获异常,然后继续确定哪个警告导致异常。 您可以通过查找warning1,warning2和warning3标准的元素来完成此操作。 一旦找到属于特定警告的元素,就可以处理它。 下面的代码概述了这种方法。 我不知道不同场景的定位器,因此您需要添加特定的find方法和定位器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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