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

Selenium WebDriver Python3:页面刷新至找到文本后执行自动购买

完善Selenium实现Alza商品监控与自动下单流程

需求梳理

  • 使用账号凭证登录https://www.alza.sk/EN/
  • 按指定间隔(如60秒)刷新页面
  • 检测页面中指定商品的“In stock”文本
  • 库存可用时执行一系列下单操作:添加到购物车→结算→处理弹窗→选择取货门店→选择支付方式→继续

完整代码实现

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 配置信息
USERNAME = "你的账号"
PASSWORD = "你的密码"
TARGET_PRODUCT_URL = "你要监控的商品页面URL"
REFRESH_INTERVAL = 60  # 刷新间隔(秒)

def login(driver):
    # 点击登录按钮
    login_btn = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, "a.login"))
    )
    login_btn.click()
    
    # 输入账号密码
    username_input = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "login-email"))
    )
    username_input.send_keys(USERNAME)
    
    password_input = driver.find_element(By.ID, "login-password")
    password_input.send_keys(PASSWORD)
    
    # 提交登录
    submit_btn = driver.find_element(By.ID, "login-button")
    submit_btn.click()
    # 等待登录完成跳转
    time.sleep(3)

def check_stock_and_order(driver):
    while True:
        driver.refresh()
        try:
            # 检测库存状态
            stock_status = WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.XPATH, "//*[contains(text(), 'In stock')]"))
            )
            print("商品已到货!开始下单流程")
            
            # 点击Add to cart按钮
            add_to_cart_btn = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, "button.addToCart"))
            )
            add_to_cart_btn.click()
            
            # 点击Proceed to Checkout
            proceed_btn = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, "a.btnProceedToCheckout"))
            )
            proceed_btn.click()
            
            # 点击Continue
            continue_btn = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, "button.btnContinue"))
            )
            continue_btn.click()
            
            # 处理弹窗:点击Do not add anything
            try:
                do_not_add_btn = WebDriverWait(driver, 5).until(
                    EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Do not add anything')]"))
                )
                do_not_add_btn.click()
            except:
                # 没有弹窗则跳过
                pass
            
            # 勾选Bratislava - main shop复选框
            store_checkbox = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Bratislava - main shop')]/preceding-sibling::input"))
            )
            if not store_checkbox.is_selected():
                store_checkbox.click()
            
            # 点击Confirm your selection
            confirm_btn = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, "button.btnConfirm"))
            )
            confirm_btn.click()
            
            # 展开All payments option
            payments_expand_btn = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, "a.expandAllPaymentOptions"))
            )
            payments_expand_btn.click()
            
            # 勾选Cash / Card (when collected)
            payment_checkbox = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Cash / Card (when collected)')]/preceding-sibling::input"))
            )
            if not payment_checkbox.is_selected():
                payment_checkbox.click()
            
            # 点击Continue
            final_continue_btn = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, "button.btnContinue"))
            )
            final_continue_btn.click()
            
            print("下单流程执行完成")
            break  # 完成后退出循环
            
        except:
            print("商品暂无库存,等待下一次刷新...")
            time.sleep(REFRESH_INTERVAL)

if __name__ == "__main__":
    driver = webdriver.Chrome()
    driver.maximize_window()
    
    # 打开登录页面
    driver.get("https://www.alza.sk/EN/")
    # 执行登录
    login(driver)
    # 跳转到目标商品页面
    driver.get(TARGET_PRODUCT_URL)
    # 开始监控与下单
    check_stock_and_order(driver)
    
    # 关闭浏览器(可选)
    # driver.quit()

代码说明

  • 使用WebDriverWait替代固定等待时间,提升代码稳定性,避免页面加载慢导致的元素找不到问题
  • 拆分功能为login和check_stock_and_order函数,逻辑更清晰
  • 加入异常捕获,处理库存未到货的情况,持续循环刷新
  • 针对可能出现的弹窗做了容错处理,避免因弹窗未出现导致代码报错
  • 所有元素定位使用常见的CSS_SELECTOR和XPATH,适配页面结构变化

注意事项

  • 请替换代码中的USERNAME、PASSWORD和TARGET_PRODUCT_URL为实际信息
  • 页面元素选择器可能随网站更新变化,若运行报错需检查元素定位是否失效
  • 频繁刷新可能触发网站反爬机制,建议适当调整刷新间隔

内容的提问来源于stack exchange,提问作者Syny13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:35:36