Python Selenium异常处理实战:超时与节点未找到

阿橙
阿橙
发布时间:2026-10-14 | 2人浏览过
原创

本文详解Python Selenium中的异常处理机制,涵盖超时和节点未找到等常见错误的捕获方法。通过try-except-finally结构确保浏览器资源释放,并深入解析sys.exit()在脚本退出时的行为逻辑,帮助开发者构建更健壮的自动化测试脚本。

1、说明

在使用Selenium进行自动化操作时,难免会遭遇各类异常状况,例如页面加载超时或指定节点未找到等。一旦触发此类错误,程序通常会中断运行。为应对这种情况,建议采用try-except语句来捕获并处理这些异常,以保证程序的稳定性。

2、实例


from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException
browser = webdriver.Chrome()
try:
  browser.get('https://www.baidu.com')
except TimeoutException:
  print('超时')
try:
  browser.find_element_by_id('aa')
except NoSuchElementException:
  print('未找到节点')
finally:
browser.close()

关于异常处理的实例扩展:

作为一名Python初学者,我正在编写一个利用Selenium登录Web应用程序并打印Nagios信息的脚本。目前该脚本能按预期运行,但如果无法访问目标网站,我希望它能向系统发出警报。以下是我的初步代码实现。


#!/usr/bin/env python

import sys
from selenium import webdriver

url = '<main web site>'
systemInformation = '<sys information site>'
logout = '<log out link>'
browser = webdriver.PhantomJS('<path to phantomjs for headless operation>')
login_username = '<username>'
login_password = '<password>'

try:
  browser.get(url)
  username = browser.find_element_by_name("username")
  password = browser.find_element_by_name("password")

  username.send_keys(login_username)
  password.send_keys(login_password)

  link = browser.find_element_by_name('loginbutton')
  link.click()

  browser.get(systemInformation)

  print "OK: Web Application is Running"
  for element in browser.find_elements_by_name('SystemReportsForm'):
    print element.text

  browser.get(logout)
  browser.quit()
  sys.exit(0)
except:
  print "WARNING: Web Application is Down!"
  sys.exit(2)

我原本期望当try块中的操作失败时,程序能跳转至except块执行。然而,即使存在except子句,脚本似乎仍会同时输出try和except的内容。我确信问题出在简单的逻辑疏忽上,但尚未找到原因。

经过调整,我最终解决了这个问题,感谢提供的帮助。


#!/usr/bin/env python

import sys, urllib2
from selenium import webdriver

url = '<log in url>'
systemInformation = '<sys info url>'
logout = '<logout url>'
browser = webdriver.PhantomJS('<phantomjs location for headless browser>')
login_username = '<user>'
login_password = '<password>'

def login(login_url,status_url):
  browser.get(login_url)
  username = browser.find_element_by_name("username")
  password = browser.find_element_by_name("password")

  username.send_keys(login_username)
  password.send_keys(login_password)

  link = browser.find_element_by_name('loginbutton')
  link.click()

  browser.get(status_url)

  if browser.title == 'Log In':
    print "WARNING: Site up but Failed to login!"
    browser.get(logout)
    browser.quit()
    sys.exit(1)
  else:
    print "OK: Everything Looks Good"
    for element in browser.find_elements_by_name('SystemReportsForm'):
      print element.text

    browser.get(logout)
    browser.quit()
    sys.exit(0)

req = urllib2.Request(url)

try:
  urllib2.urlopen(req)
  login(url,systemInformation)
except urllib2.HTTPError as e:
  print('CRITICAL: Site Appears to be Down!')
  browser.get(logout)
  browser.quit()
  sys.exit(2)

解决方案

关键点在于sys.exit([status])函数会引发SystemExit(status)异常,这正是导致程序进入except子句执行的原因。

sys.exit()通过引发SystemExit异常来退出解释器。若省略状态参数或传入None,默认退出状态为0(表示成功);若传入整数,则直接作为系统退出状态;若传入其他对象,则将其打印输出,且退出状态设为1(表示失败)。

将sys.exit(0)调用从try块内部移除,放置到合适的位置或确保其不会干扰异常捕获逻辑。

到此这篇关于Python Selenium异常处理的实例分析的文章就介绍到这了,更多相关Python Selenium异常处理内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表