You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

监控价格时遇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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:09:28