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
相关产品推荐
相关产品推荐

