代码逻辑解析:

  1. 时间设置

    • mstime 设置了抢购时间。当前系统时间在循环中不断与该时间进行比较,当达到或超过抢购时间时,程序会开始执行结算和提交订单操作。
  2. 购物车全选

    • 程序首先会在购物车页面找到“全选”按钮,点击以全选购物车中的所有商品。通过 WebDriverWait 保证页面加载完成后再进行操作。
  3. 结算操作

    • 程序会等待页面中的“结算”按钮出现,然后使用 ActionChains 模拟鼠标悬停并点击该按钮。
  4. 提交订单操作

    • 在结算成功后,程序会寻找“提交订单”按钮并执行点击操作。
  5. 循环检测时间

    • 程序会不断监控当前系统时间,当达到设定的抢购时间后执行抢购流程。

关键点:

  • ActionChains 模拟鼠标悬停:淘宝的部分按钮(如“结算”)只有在鼠标悬停时才会显示,因此使用 ActionChains.move_to_element() 模拟用户悬停行为。
  • 循环检查当前时间:程序会持续检查时间,并在抢购时间到达后执行下一步操作。
  • WebDriverWait:确保元素加载完成后再进行交互,避免因为页面还没完全加载而找不到元素。

需要注意的事项:

  • Xpath 的稳定性:淘宝页面的结构可能会随着更新而改变,确保 XPath 在页面变动后依然有效。如果发现某些元素找不到,可以通过浏览器的开发者工具重新获取 XPath。
  • 登录状态:程序启动后,用户需要手动扫码登录,以确保后续的自动化操作可以顺利进行。

代码实现

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.webdriver.common.action_chains import ActionChains
import datetime
from selenium import webdriver
import time

# 获取当前时间并设置抢购时间
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
mstime = "2024-09-12 10:08:00.000000"  # 设置时间为要抢货的时间
print(f"当前时间: {now}, 预定抢购时间: {mstime}")

# 初始化WebDriver
WebBrowser = webdriver.Chrome()

# 打开淘宝首页
print("正在打开淘宝...")
WebBrowser.get("https://www.taobao.com")
WebBrowser.maximize_window()  # 使窗口最大化,防止部分元素不显示
time.sleep(5)  # 等待页面加载

# 点击登录链接
print("正在点击登录链接...")
WebBrowser.find_element(By.LINK_TEXT, "亲,请登录").click()
print("请扫码登录")
time.sleep(10)  # 等待手动扫码登录

# 跳转到购物车页面
print("跳转到购物车页面...")
WebBrowser.get("https://cart.taobao.com/cart.htm")

# 等待购物车页面完全加载
print("等待购物车页面加载完成...")
WebDriverWait(WebBrowser, 10).until(
    EC.presence_of_element_located((By.ID, "listContainer_1"))
)
print("购物车页面加载完成")

# 尝试点击全选按钮
while True:
    try:
        print("查找全选按钮...")
        # 查找全选按钮的 XPath,注意这个路径可能会变
        if WebBrowser.find_element(By.XPATH, "/html/body/div[4]/div[2]/div[2]/div/div[1]/div/div/div[1]/div/div/div[2]/label/span[1]/input"):
            print("找到全选按钮,正在点击全选按钮...")
            element = WebDriverWait(WebBrowser, 10).until(
                EC.presence_of_element_located(
                    (By.XPATH,
                     "/html/body/div[4]/div[2]/div[2]/div/div[1]/div/div/div[1]/div/div/div[2]/label/span[1]/input"))
            )
            element.click()  # 点击全选按钮
            print("全选按钮点击成功")
            break
    except Exception as e:
        print(f"找不到全选按钮: {e}")

# 循环检查当前时间,等待抢购时间到达
while True:
    now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
    print(f"当前时间: {now}")
    
    # 如果当前时间超过抢购时间,开始执行抢购操作
    if now > mstime:
        print("时间已到,开始抢购流程...")
        
        # 尝试点击“结算”按钮
        while True:
            try:
                print("查找结算按钮...")
                if WebBrowser.find_element(By.XPATH, "//*[text()='结算']"):
                    my_taobao = WebDriverWait(WebBrowser, 10).until(
                        EC.presence_of_element_located((By.XPATH, "//*[text()='结算']"))
                    )
                    print(f"找到结算按钮: {my_taobao}")
                    
                    # 使用ActionChains模拟鼠标悬停并点击
                    actions = ActionChains(WebBrowser)
                    actions.move_to_element(my_taobao).pause(1).click().perform()
                    print("结算按钮点击成功")
                    time.sleep(1)
                    break
            except Exception as e:
                print(f"结算按钮点击失败: {e}")
        
        # 尝试点击“提交订单”按钮
        while True:
            try:
                print("查找提交订单按钮...")
                if WebBrowser.find_element(By.XPATH, "//*[text()='提交订单']"):
                    submit_button = WebDriverWait(WebBrowser, 10).until(
                        EC.presence_of_element_located((By.XPATH, "//*[text()='提交订单']"))
                    )
                    print(f"找到提交订单按钮: {submit_button}")
                    
                    # 使用ActionChains模拟鼠标悬停并点击
                    actions.move_to_element(submit_button).pause(1).click().perform()
                    print("提交订单按钮点击成功,抢购成功,请尽快付款")
                    time.sleep(1)
                    break
            except Exception as e:
                print(f"提交订单按钮点击失败: {e}")
                print(f"结算提交成功,已抢到商品,请及时支付订单")
                break