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

如何解决Python Selenium+XPath读取CSV时重复填充数据及循环停滞问题

问题分析与解决方案

核心问题

你的脚本每次循环都会重新加载Checkout页面,且未完成地址填写后的提交/推进步骤,导致流程始终停留在地址填写环节,同时可能因页面重置或CSV遍历异常,出现重复录入同一行数据的情况。

具体修复步骤

1. 验证CSV数据遍历是否正常

在循环开头添加打印语句,确认是否正确获取CSV的每一行数据:

for line in csv_reader:
    print(f"正在处理数据行: {line}")  # 验证是否遍历不同行
    # 后续代码...

如果打印结果始终是同一行,检查CSV文件是否存在重复数据,或确认csv_reader是否被意外重置。

2. 完成当前流程的后续步骤

填写完地址信息后,必须添加提交地址的操作,推进到下一个流程环节(需根据实际页面元素调整按钮定位):

# 填写完address后添加:
submit_btn = driver.find_element(By.XPATH, '//*[@id="提交按钮的XPATH"]')
submit_btn.click()
# 等待页面跳转或下一步加载
time.sleep(3)  # 建议替换为显式等待,稳定性更高

只有完成提交,流程才会推进,不会停留在地址填写页面重复操作。

3. 优化页面加载逻辑

不要在每次循环内都调用driver.get重新加载Checkout页面:

  • 若处理完一行后需要重新进入Checkout流程,确保完成上一行的所有步骤后,再跳转回入口页面或重新加载;
  • 或者在循环外只加载一次Checkout页面,后续循环通过页面的“新增地址”等按钮重置表单,而非重新加载整个页面。

4. 使用显式等待替代固定sleep(可选但推荐)

固定的time.sleep不稳定,改用Selenium的显式等待,等待元素加载完成后再操作,避免因页面加载慢导致的元素定位失败:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 示例:等待姓名输入框加载完成
name = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, '//*[@id="container"]/div/div[2]/div/div[1]/div[2]/div/div/div/div/div/label/div[2]/div/form/div/div[2]/div[1]/input'))
)
name.send_keys(line[0])

5. 清空输入框(若页面未重置)

如果没有重新加载页面、复用当前表单,下次循环前需要清空输入框,避免数据叠加:

name.clear()  # 填写前清空输入框
name.send_keys(line[0])

修复后示例代码片段

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

with open('C://pyhtonprograms//flipkartinfo.csv', 'r') as csv_file:
    csv_reader = csv.reader(csv_file)
    next(csv_reader)  # 跳过表头

    for line in csv_reader:
        print(f"处理数据: {line}")
        # 仅在首次或需要重新进入流程时加载页面,根据实际情况调整
        driver.get("https://www.flipkart.com/checkout/init?view=GROCERY&loginFlow=false")
        
        # 等待姓名输入框加载
        name = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, '//*[@id="container"]/div/div[2]/div/div[1]/div[2]/div/div/div/div/div/label/div[2]/div/form/div/div[2]/div[1]/input'))
        )
        name.clear()
        name.send_keys(line[0])

        phone = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, '//*[@id="container"]/div/div[2]/div/div[1]/div[2]/div/div/div/div/div/label/div[2]/div/form/div/div[2]/div[2]/input'))
        )
        phone.clear()
        phone.send_keys(line[1])

        # 省略其他输入框的类似操作...

        # 填写完成后提交地址,推进流程
        submit_btn = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, '//*[@id="提交按钮的XPATH"]'))
        )
        submit_btn.click()
        
        # 等待流程推进,进入下一步或返回可重新操作的状态
        time.sleep(3)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:55:05