Selenium代码添加try...except块仍抛出TimeoutException该如何解决
问题原因
你写的异常捕获语句语法不符合Python规范:在except后使用or连接多个异常类型时,Python会先执行布尔运算,ElementNotInteractableException or NoSuchElementException or TimeoutException的运算结果始终为第一个非空的ElementNotInteractableException,相当于你只配置了捕获这一种异常,TimeoutException不在捕获范围内,所以超时场景下异常会直接抛出。
解决方案
把多个需要捕获的异常放在元组里,用逗号分隔即可,修正后的代码如下:
# 注意提前导入需要捕获的异常类 from selenium.common.exceptions import ElementNotInteractableException, NoSuchElementException, TimeoutException try: browser.find_element('xpath', '/html/body/ul').click() wait = WebDriverWait(browser, 10) wait.until(EC.visibility_of_element_located(('xpath', '/html/body/div[1]/div[3]/span'))) return ' '.join(browser.find_element('id', 'response').text.split('\n')[0].split()[:-1]) # 用元组包裹多个需要捕获的异常类型,用逗号分隔 except (ElementNotInteractableException, NoSuchElementException, TimeoutException): return 'No result'
可选优化点
- 如果需要排查异常具体类型,可以在捕获块中增加日志输出:
except (ElementNotInteractableException, NoSuchElementException, TimeoutException) as e: print(f"触发异常类型:{type(e).__name__}") return 'No result'
- 尽量避免使用绝对xpath定位元素,页面结构稍有变动就会触发元素找不到的异常,可以改用id、class、相对xpath等更稳定的定位方式。
内容的提问来源于stack exchange,提问作者Honn
相关产品推荐
相关产品推荐

