如何捕获异常并继续执行任务?

时间:2017-01-20 15:37:32

标签: python selenium try-catch

我是Selenium自动化的新手。请记住这一点,请回答下面的问题,即使对那些技术人员来说听起来也很荒谬。

我试图获取页面中的所有ID: (我使用的是Python,也是使用Python的新手)

这是我使用的代码:

for b1 in driver.find_elements_by_xpath('//*[@id]'):
            print b1.get_attribute('id')

虽然这会按预期显示ID,但在某一时刻脚本最终会出现' StaleElementReferenceException'。

我抓住了这个例外:

try:
        for b1 in driver.find_elements_by_xpath('//*[@id]'):
            print b1.get_attribute('id')
except StaleElementReferenceException:
        print 'Exception'

现在,虽然捕获了异常,但我的脚本在那里停止而不显示所有ID。

它会显示所有ID,直到此异常点,然后停在那里。

如何让它继续执行它的操作并跳过此异常?

2 个答案:

答案 0 :(得分:0)

忽略该异常可能会导致id属性值丢失。

异常本身很可能是在您找到id的所有元素时页面未完全加载的结果。给页面加载更多时间,然后找到元素。

您可以先尝试使用.set_page_load_timeout()增加页面加载超时。或者,更可靠的方法可能是您的网页特定 - 使用WebDriverWait等待页面上某个元素的存在/可见性,这可能表示该页面已被加载。例如,如果页面异步加载产品列表,则可以等待页面的第一个产品元素/块/部分的可见性。

如果页面不断加载和更新导致陈旧元素异常的DOM树,您可以force stop the page load

作为旁注,如果您只需要获得id属性和性能非常重要,那么使用selenium执行此操作只会产生大量开销 - 每个get_attribute()命令在循环中是JSON over HTTP command这是昂贵的(related topic,如果感兴趣)。相反,您可以等待页面加载,抓取driver.page_source并使用HTML解析器,例如lxmlBeautifulSoup来提取id属性值。

答案 1 :(得分:0)

您必须在异常处理中使用传递关键字:

 except StaleElementReferenceException:
    pass