200字
用 Selenium 自动化网页批量录入
2025-11-24
2025-11-24

自动例如.gif

用 Selenium 自动化网页批量录入

本文介绍一个面向“上海区批量入账”的网页自动化小工具的核心脚本 auto_fill.py,如何在本地页面上自动点击“新增一行”,并批量填充五列数据(默认 50 行),支持从 CSV 读取或使用内置示例数据补齐。

为什么写这个工具

  • 背景:上海区批量入账场景,网页仅支持人工逐条录入,流程耗时、重复劳动多、易出错。
  • 目标:通过网页自动化录入,显著缩短入账耗时、提升准确率与一致性。
  • 人力与周期:整体人力耗时 2 个工作日,其中工具核心功能研发与联调约 5 小时。
  • 预期推广:通过 1 小时的集中培训完成安装与演示,让财务人员可独立使用;预计获得“业务分奖励/表扬信”等认可形式。

方案总览

  • 页面侧:index.html 提供动态表单,每行包含 5 个输入框,可点击 + 新增一行 增加行数,并支持导出多列 CSV
  • 自动化侧:auto_fill.py 使用 Selenium 自动打开页面、点击新增行到目标数量、并逐行填入 5 列数据。
  • 数据来源:优先读取同目录 input.csv 的前 50 行×5 列,若不足则按“演示行X-列Y”自动补齐。
  • 浏览器策略:优先连接已开启的 Chrome 远程调试端口 127.0.0.1:9222,回退到本地 Chrome→Edge→Firefox。

核心代码解析

数据准备:get_values

  • 位置:d:\I_LOVE_KUNKUN\11月\演示案例\auto_fill.py:14
  • 作用:读取 CSV 的前 rows_count 行(每行最多 5 列),不足的列与行用“演示行X-列Y”补齐,确保最终是 rows_count×5 的二维数据。
  • 关键逻辑:
    • 读取 csv_pathauto_fill.py:12)的内容并截取到指定行数(auto_fill.py:17auto_fill.py:24)。
    • 若行数不足则补齐(auto_fill.py:27auto_fill.py:33)。

浏览器驱动:create_driver

  • 位置:d:\I_LOVE_KUNKUN\11月\演示案例\auto_fill.py:36
  • 作用:优先使用已启动的 Chrome 远程调试端口连接;失败时回退到 Chrome/Edge/Firefox。
  • 关键逻辑:设置 Options().add_experimental_option('debuggerAddress', '127.0.0.1:9222')auto_fill.py:38auto_fill.py:40)。

自动化流程:run

  • 位置:d:\I_LOVE_KUNKUN\11月\演示案例\auto_fill.py:50
  • 步骤:
    • 打开本地页面 index.htmlauto_fill.py:52)。
    • 等待并获取“新增一行”按钮(auto_fill.py:54)。
    • 连续点击到目标行数(默认 count=50auto_fill.py:55auto_fill.py:58)。
    • 等待行渲染完成并拿到所有行节点(auto_fill.py:59auto_fill.py:61)。
    • 逐行填入五列数据(auto_fill.py:62auto_fill.py:66)。

完整代码

from pathlib import Path
import os
import csv
import time
import subprocess
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

base = Path(__file__).resolve().parent
html_path = base / 'index.html'
csv_path = base / 'input.csv'

def find_chrome():
    candidates = [
        r"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
        r"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
        str(Path(os.getenv('LOCALAPPDATA', '')) / 'Google/Chrome/Application/chrome.exe'),
    ]
    for p in candidates:
        if p and Path(p).is_file():
            return p
    return None

def start_chrome_debug(port=9222, user_data_dir=None):
    exe = find_chrome()
    if not exe:
        return False
    if not user_data_dir:
        user_data_dir = str(base / 'chrome_profile')
    os.makedirs(user_data_dir, exist_ok=True)
    cmd = [exe, f'--remote-debugging-port={port}', f'--user-data-dir={user_data_dir}']
    try:
        subprocess.Popen(cmd)
        time.sleep(1.5)
        return True
    except Exception:
        return False

def get_values(rows_count, cols=5):
    vals = []
    try:
        with open(csv_path, 'r', encoding='utf-8-sig') as f:
            for row in csv.reader(f):
                r = []
                for j in range(cols):
                    r.append(row[j] if j < len(row) else '')
                vals.append(r)
                if len(vals) >= rows_count:
                    break
    except Exception:
        vals = []
    if len(vals) < rows_count:
        for i in range(len(vals) + 1, rows_count + 1):
            vals.append([f'演示行{i}-列{j}' for j in range(1, cols + 1)])
    for i in range(rows_count):
        for j in range(cols):
            if vals[i][j] == '':
                vals[i][j] = f'演示行{i + 1}-列{j + 1}'
    return vals

def create_driver():
    try:
        opts = Options()
        opts.add_experimental_option('debuggerAddress', '127.0.0.1:9222')
        return webdriver.Chrome(options=opts)
    except Exception:
        try:
            return webdriver.Chrome()
        except Exception:
            try:
                return webdriver.Edge()
            except Exception:
                return webdriver.Firefox()

def run():
    start_chrome_debug(9222, str(base / 'chrome_profile'))
    driver = create_driver()
    driver.get(html_path.as_uri())
    wait = WebDriverWait(driver, 10)
    add_btn = wait.until(EC.element_to_be_clickable((By.ID, 'addRowBtn')))
    count = 50
    for _ in range(count - 1):
        add_btn.click()
        time.sleep(0.02)
    wait.until(lambda d: len(d.find_elements(By.CSS_SELECTOR, '#rows .row')) >= count)
    rows = driver.find_elements(By.CSS_SELECTOR, '#rows .row')
    values = get_values(count, 5)
    for i in range(count):
        inputs = rows[i].find_elements(By.CSS_SELECTOR, '.value-input')
        for j in range(5):
            inputs[j].clear()
            inputs[j].send_keys(values[i][j])
    time.sleep(2)
    driver.quit()

if __name__ == '__main__':
    run()

使用步骤

  • 打开网页:双击 index.html
  • 运行自动录入:在当前目录执行:
    • python auto_fill.py
  • 可选(远程调试更稳定):先启动 Chrome 并开启端口,再运行脚本:
    • Windows:"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" --remote-debugging-port=9222
    • 然后执行:python auto_fill.py

CSV 数据规范

  • 文件名:input.csv(与脚本同目录)。
  • 列数:前 5 列有效;若不足 5 列则空位自动补齐为“演示行X-列Y”。
  • 示例:

姓名,电话,地址,公司,备注
张三,13800001234,上海浦东新区,某公司,备注A
李四,13800004321,上海闵行区,某公司B,备注B

`

常见问题与排查

  • 无法启动浏览器/驱动报错:
    • 确认已安装 Chrome/Edge/Firefox 任一浏览器。
    • 若使用远程调试端口,确保端口 9222 已被 Chrome 打开。
  • 页面未渲染到 50 行:
    • 适当增大点击间隔(auto_fill.py:58time.sleep(0.02))。
    • 检查页面按钮 id 与行选择器是否与 index.html 保持一致。
  • input.csv 不存在或空:
    • 脚本会自动用“演示行X-列Y”补齐,不影响演示。

扩展方向

  • 读取 Excel(xlsx):可采用 openpyxlpandas 读取为二维数据后复用填充逻辑。
  • 表单字段校验与模板:在 index.html 增加列名映射与必填校验提示。
  • 更大批量与稳态优化:分批点击与分批填充,适当增加等待以提高稳定性。
  • 日志与异常处理:加入详细日志、截图与失败重试,便于问题定位。

结语

该工具围绕“批量入账”的刚性需求,利用 Selenium 将重复的人工录入流程自动化。在 2 个工作日的整体投入与约 5 小时的核心研发下,达成了可培训、可推广、可复用的自动化方案,有望在上海区获得“业务分奖励/表扬信”的认可,并为后续流程持续优化奠定基础。

image-giWK.png

用 Selenium 自动化网页批量录入
作者
一晌小贪欢
发表于
2025-11-24
License
CC BY-NC-SA 4.0

评论