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

Selenium多线程环境下send_keys方法无法生效问题排查

Selenium多线程填充输入框问题排查与修复

问题点分析

  • 未导入time模块:脚本中使用time.sleep(2)但未导入time库,理论会触发NameError,推测是粘贴时遗漏,需补充。
  • 变量名错误:crawler函数循环变量为id,却使用未定义的i打印;fetcher内同样用未定义的i打印,需替换为id。
  • Driver资源管理混乱:提前创建drivers列表却未使用,反而每次调用fetcher都新建driver,浪费资源且易引发线程冲突。
  • 未等待元素加载:直接调用find_element可能在页面未完全渲染时执行,导致元素定位失败或send_keys未生效。
  • 线程与Driver绑定错误:多线程中每个线程应绑定固定driver实例,而非每次任务新建,避免资源竞争。

修复后的脚本

from concurrent.futures import ThreadPoolExecutor
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import numpy as np
import time
from selenium import webdriver

def driver_setup():
    path = "geckodriver.exe"
    options = webdriver.FirefoxOptions()
    options.add_argument('--incognito')
    # options.add_argument('--headless')
    driver = webdriver.Firefox(options=options, executable_path=path)
    return driver

def fetcher(id, driver):
    print(f"Processing ID: {id}")
    try:
        driver.get("https://www.roboform.com/filling-test-all-fields")
        # 显式等待元素加载,最长等待10秒
        user_id_input = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, '//input[@name="30_user_id"]'))
        )
        user_id_input.clear()  # 清空输入框避免残留内容
        user_id_input.send_keys(str(id))
        time.sleep(2)
        print(f"ID {id} sent successfully")
    except Exception as e:
        print(f"Error processing ID {id}: {str(e)}")

def crawler(args):
    ids_chunk, driver = args
    for id in ids_chunk:
        fetcher(id, driver)

if __name__ == "__main__":
    ids = list(range(0, 50))
    print(f"Total IDs to process: {len(ids)}")
    chunks = np.array_split(np.array(ids), 4)
    drivers = [driver_setup() for _ in range(4)]
    
    # 将每个chunk和对应的driver配对
    task_args = list(zip(chunks, drivers))
    
    with ThreadPoolExecutor(max_workers=4) as executor:
        executor.map(crawler, task_args)
    
    # 关闭所有driver
    for driver in drivers:
        driver.quit()

关键修复说明

  • 补充time和Selenium显式等待模块,确保依赖完整。
  • 修正变量名错误,统一使用id作为打印变量。
  • 每个线程绑定固定driver实例,通过task_args配对传入,避免重复创建driver。
  • 使用WebDriverWait显式等待元素出现,替代固定休眠,提升执行稳定性。
  • 添加异常捕获,便于排查执行过程中的错误。
  • 增加if __name__ == "__main__",确保多线程代码在主模块下正确执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:10:28