Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python-以多种方式处理一个异常_Python 3.x_Selenium_Exception_Web Scraping - Fatal编程技术网

Python 3.x Python-以多种方式处理一个异常

Python 3.x Python-以多种方式处理一个异常,python-3.x,selenium,exception,web-scraping,Python 3.x,Selenium,Exception,Web Scraping,我已经在搜索引擎中找到了这个问题。我有一种异常需要以不同的方式处理,因为不同的警告不是周期性的,并且没有相同的文档布局,在我不久前自动化的网站上。 我目前使用的解决方案是,当网站上出现上述警告时,对代码的某些部分进行注释和删除 它总是给我元素NotVisibleException,但是对于同一个错误有两个异常是不起作用的,因为它将由第一个异常处理 While True: try: #some code except ElementNotVisibleExcepti

我已经在搜索引擎中找到了这个问题。我有一种异常需要以不同的方式处理,因为不同的警告不是周期性的,并且没有相同的文档布局,在我不久前自动化的网站上。 我目前使用的解决方案是,当网站上出现上述警告时,对代码的某些部分进行注释和删除

它总是给我
元素NotVisibleException
,但是对于同一个错误有两个异常是不起作用的,因为它将由第一个异常处理

While True:
    try:
        #some code
    except ElementNotVisibleException:
        #code to handle error1
    except ElementNotVisibleException:
        #code to handle error2 that will never be procesed
嵌套
try…除了
block看起来太糟糕了。因为当处理失败时,它将是由其他异常引起的
NoSuchElementException
,而仅仅使用
except
似乎也不正确,因为它可以隐藏失败的真正原因

While True:
    try:
        #some code
        break
    except ElementNotVisibleException:
        try:
            #code to handle error1
            break
        except:
            #code to handle error2
所以,我的问题是,有没有其他的方法来处理多重方式上的异常,一种更具python风格的方式

谢谢

编辑:进一步解释我打算做什么

假设必须导航一些菜单,但就在菜单出现之前,一些站点警报出现,在这种情况下,我们将其称为warning1、warning2和Warning3。在这种情况下,由于警告使此菜单不可见,脚本将中断

警告1:将有一个“继续”按钮,并且位于同一帧中

警告2:将是一个带有复选框和按钮(带有不同的占位符、id和xpath)的覆盖的弹出窗口

警告3:与警告1几乎相同,但id、名称和xpath不同

但是它们都会抛出一个
元素notvisibleexception
。因此,所有这些都不能以相同的方式处理,可能warningN会超时出现(这个脚本很旧,大概有两年了),我真的不想在它上花费太多时间,因为我可能会在我的职业生涯中离开它,并希望它为即将担任该职位的人留下可读性和明确性。所以这家伙可以去添加一些代码来克服新的警告信息

EDIT2:@JeffC的答案得到了正确的想法,并将其与@CoryKramer的答案结合起来,使之更适合新来的家伙我想到了以下几点:

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”类型不可调用

我认为您不需要捕获多个异常。例外是一样的,原因是不同的。原因与出现的警告有关。我将捕获异常,然后继续确定导致异常的警告。您可以通过定位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

我不认为您真的需要捕获多个异常。例外是一样的,原因是不同的。原因与出现的警告有关。我将捕获异常,然后继续确定导致异常的警告。您可以通过定位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

您的意思是想用不同的日志处理两个
ElementNotVisibleException
s中的每一个吗?你能分享一些真实的代码和真实的异常日志吗?用英语(而不是代码)描述一个你遇到这种情况的典型场景,以及在每种情况下你想做什么。@JeffC添加了一些场景来解释我自己more@Andersson不行,它有一些合理的信息。但是我可以告诉你的是,代码本身没有问题。当一种新的警告出现在网站上时,它会刹车,如果是旧的警告,它会得到很好的处理。您希望如何处理每个警告警报?这些警报是什么?它们只是
div
节点吗?您的意思是要用不同的日志处理两个
ElementNotVisibleException
s中的每一个节点吗?你能分享一些真实的代码和真实的异常日志吗?用英语(而不是代码)描述一个你遇到这种情况的典型场景,以及在每种情况下你想做什么。@JeffC添加了一些场景来解释我自己more@Andersson不行,它有一些合理的信息。但是我可以告诉你的是,代码本身没有问题。当一种新的警告出现在网站上时,它会刹车,如果是旧的警告,它会得到很好的处理。您希望如何处理每个警告警报?这些警报是什么?它们只是
div
节点吗?