多段代码触发同一TimeoutException时,如何合理使用try-catch?
解决TimeoutException定位难题的两种方案
方案一:给每段操作单独加try-except
这是最直接的方式,能精准区分是Cookie按钮操作失败,还是商品标题查找超时,调试起来一目了然:
# 处理Cookie弹窗 try: reject_cookies_btn = self.wait.until(lambda driver: driver.find_element(By.CSS_SELECTOR, "[data-type='no']")) self.wait.until(EC.element_to_be_clickable(reject_cookies_btn)) reject_cookies_btn.click() except TimeoutException: print("关闭Cookie页脚失败:超时未找到按钮或按钮不可点击") # 处理商品标题 try: product_title = self.wait.until(lambda driver: driver.find_element(By.CSS_SELECTOR, "[class='title-name a-fonts--26 a-colors--black-t js-detail-title']")) product_description["title"] = product_title.text except TimeoutException: print("获取商品标题失败:超时未找到标题元素")
方案二:自定义等待的错误提示(不用拆分try-except)
利用WebDriverWait的message参数,给每个等待步骤添加专属错误信息,这样即使在同一个try块里,抛出的异常也能明确指出问题环节:
from selenium.common.exceptions import TimeoutException try: # 关闭Cookie页脚,自定义超时提示 reject_cookies_btn = self.wait.until( lambda driver: driver.find_element(By.CSS_SELECTOR, "[data-type='no']"), message="未找到Cookie拒绝按钮" ) self.wait.until( EC.element_to_be_clickable(reject_cookies_btn), message="Cookie拒绝按钮无法点击" ) reject_cookies_btn.click() # 查找商品标题,自定义超时提示 product_title = self.wait.until( lambda driver: driver.find_element(By.CSS_SELECTOR, "[class='title-name a-fonts--26 a-colors--black-t js-detail-title']"), message="未找到商品标题元素" ) product_description["title"] = product_title.text except TimeoutException as e: print(f"操作出错:{e}")
如果需要针对不同失败场景做不同处理(比如Cookie没找到可以跳过,标题没找到要终止流程),选方案一;如果只是需要快速定位问题,不想拆分代码块,方案二更合适。
内容的提问来源于stack exchange,提问作者Tech Visionary
相关产品推荐
相关产品推荐

