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

