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

Selenium循环输入异常:重复填充国家信息问题求助

问题排查与解决方案

核心问题分析

  • 三层嵌套循环逻辑错误:你当前的代码用了三层for循环嵌套,这会导致所有国家、货币和代码进行全组合遍历,而且每次最内层循环都会从第一个国家开始执行,所以国家字段永远停留在第一条记录,无法切换后续内容。
  • 元素引用失效:每次点击提交后页面会刷新,之前定位的元素对象会变成"过时"状态,直接复用会引发元素无法找到的异常。
  • 变量名冲突:函数名是code,循环变量也用了code,这会导致变量覆盖,引发不可预期的问题。
  • 输入框未清空:如果不先清空输入框,连续输入会把新内容和旧内容叠加在一起,导致填充错误。

修正后的代码

首先假设三个CSV文件的行数完全一致且顺序一一对应,我们可以将数据合并后按行遍历,确保每条记录的国家、货币、代码匹配:

from selenium import webdriver
from selenium.webdriver.common.by import By
import pandas as pd

def fill_country_forms():
    # 读取三个CSV文件
    country_df = pd.read_csv('c.csv')
    currency_df = pd.read_csv('cur.csv')
    code_df = pd.read_csv('code.csv')
    
    # 合并成一个DataFrame,方便按行遍历
    combined_data = pd.DataFrame({
        'COUNTRY': country_df['COUNTRY'],
        'CUR': currency_df['CUR'],
        'CODE': code_df['CODE']
    })
    
    driver = webdriver.Chrome()
    driver.get('http://lachisolutions.com/bitcoinerrs/countries.php')
    
    for _, row in combined_data.iterrows():
        # 每次循环重新定位元素(页面刷新后旧元素已失效)
        country_input = driver.find_element(By.CSS_SELECTOR, '.text-center+ .form-group .form-control')
        currency_input = driver.find_element(By.CSS_SELECTOR, '.form-group:nth-child(3) .form-control')
        code_input = driver.find_element(By.CSS_SELECTOR, '.form-group~ .form-group+ .form-group .form-control')
        submit_btn = driver.find_element(By.CSS_SELECTOR, '.btn-block')
        
        # 先清空输入框,再填入新内容
        country_input.clear()
        country_input.send_keys(row['COUNTRY'])
        
        currency_input.clear()
        currency_input.send_keys(row['CUR'])
        
        code_input.clear()
        code_input.send_keys(row['CODE'])
        
        # 点击提交
        submit_btn.click()
        
        # 可选:添加短时间等待,确保页面刷新完成
        driver.implicitly_wait(2)
    
    driver.quit()

fill_country_forms()

关键改进点解释

  1. 按行遍历匹配数据:用iterrows()遍历合并后的DataFrame,保证每条记录的国家、货币、代码一一对应,彻底解决嵌套循环导致的重复填充问题。
  2. 每次重新定位元素:页面提交刷新后,旧的元素对象会失效,所以每次循环都重新查找元素,避免StaleElementReferenceException异常。
  3. 清空输入框:添加clear()方法,确保输入框没有残留内容,避免内容叠加。
  4. 变量名优化:将函数名改为fill_country_forms,避免和循环变量冲突,提升代码可读性。
  5. 规范元素定位写法:使用Selenium 4推荐的By类进行元素定位,比旧的find_element_by_css_selector更符合规范。

额外优化建议

  • 推荐将三个CSV合并成一个包含COUNTRY、CUR、CODE三列的文件,这样可以避免因文件顺序不一致导致的数据匹配错误。
  • 可以使用显式等待替代隐式等待,让代码更稳定,比如等待提交按钮可点击后再操作:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 替换提交部分的代码
submit_btn = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-block'))
)
submit_btn.click()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:58:04