监控价格时遇NoSuchElementException,如何重启循环直至满足价格条件?
解决方案
你的核心需求是遇到NoSuchElementException时让循环自动重试,直到价格满足条件。原代码的问题在于捕获异常后仅刷新页面,但没有确保循环能稳定重启,且硬等待的灵活性不足。这里用显式等待替代硬等待,同时优化异常处理逻辑,让循环更可靠:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import NoSuchElementException import time import random buy_price = 8000 # 直接写整数,无需额外int()转换 price_found = False wait = WebDriverWait(wd, 10) # 初始化等待对象,最长等待10秒 while not price_found: try: # 显式等待价格元素加载完成,超时才抛出异常 current_price = wait.until( EC.presence_of_element_located((By.ID, "price_on_page")) ).text store_price = int(current_price) if store_price <= buy_price: price_found = True # 等待加入购物车按钮可点击后再操作 add_to_cart_button = wait.until( EC.element_to_be_clickable((By.XPATH, 'add_cart_element')) ) add_to_cart_button.click() time.sleep(2) # 短暂等待页面状态更新 else: # 随机等待后刷新,降低被反爬概率 random_wait_time = random.randint(30, 60) time.sleep(random_wait_time) wd.refresh() except NoSuchElementException: print("未找到目标元素,5分钟后重试...") time.sleep(300) wd.refresh() # 无需额外操作,循环会自动回到开头重试 # 结算按钮查找也加入异常处理,避免直接报错 try: purchase_button = wait.until( EC.presence_of_element_located((By.XPATH, 'purchase_code')) ) except NoSuchElementException: print("结算按钮未找到,请检查页面状态")
关键优化说明:
- 显式等待:用
WebDriverWait等待元素出现/可点击,比固定时长的硬等待更高效,能减少因页面加载延迟导致的元素找不到问题。 - 异常处理逻辑:捕获异常后刷新页面,循环会自动回到起始位置重新执行,无需额外的"重启"操作。
- 代码精简:简化
buy_price的定义;给随机等待时间设置合理范围,避免等待过短或过长。 - 末尾健壮性:结算按钮的查找也加入异常捕获,避免循环结束后直接抛出错误。
内容的提问来源于stack exchange,提问作者plattij
相关产品推荐
相关产品推荐

