Python Threading多用户登录异常:仅完成2个登录需修复
修复多线程批量登录仅执行2个用户的问题
原代码核心问题
- 仅固定创建2个线程(
Page_Thread = 2),只处理CSV中前2个用户,未遍历所有账号 - 线程传参格式错误:
args={i}应为元组格式(i,),否则会导致参数解析异常 - 主线程未等待子线程完成:
t.join缺少括号,应改为t.join(),否则主线程会直接结束 - 异常处理过于宽泛,且未在异常时关闭浏览器驱动,易残留无用进程
- ChromeOptions的
--app参数格式错误(正确格式为--app=URL),且重复调用driver.get属于冗余操作
修复后的完整代码
import threading from selenium import webdriver from selenium.common.exceptions import NoSuchElementException, WebDriverException import time from csv import reader def Login_browser(user_data): id_str, id_pass = user_data print(f"Login Id: {id_str}") print(f"Login Password: {id_pass}") options = webdriver.ChromeOptions() # 可根据需求保留或移除--app参数,修正格式为--app=目标网址 # options.add_argument('--app=http://localhost/login2/index.php') driver = webdriver.Chrome(options=options) try: driver.get('http://localhost/login2/index.php') time.sleep(1) email_field = driver.find_element_by_name("userid") email_field.send_keys(id_str) time.sleep(3) password_field = driver.find_element_by_name("pass") password_field.send_keys(id_pass) time.sleep(3) submit = driver.find_element_by_xpath("/html/body/center/form/table/tbody/tr[3]/td/button[1]") submit.click() time.sleep(30) except (NoSuchElementException, WebDriverException) as e: print(f"登录{id_str}失败: {str(e)}") time.sleep(10) finally: # 无论成功失败都确保关闭驱动,避免资源泄漏 driver.quit() if __name__ == "__main__": threads = [] with open('user.csv', 'r') as read_obj: csv_reader = reader(read_obj) ids_pass_list = list(csv_reader) # 为CSV中每个用户创建独立线程 for user in ids_pass_list: thread = threading.Thread(target=Login_browser, args=(user,)) threads.append(thread) # 启动所有线程 for t in threads: t.start() # 等待所有线程执行完成 for t in threads: t.join() print('success')
额外优化点
- 移除全局变量依赖,直接将用户账号密码作为参数传入线程函数
- 捕获具体异常类型,便于精准排查问题
- 使用
finally块确保浏览器驱动一定会被关闭,避免进程残留 - 格式化打印日志,提升可读性
内容的提问来源于stack exchange,提问作者OSCAR A
相关产品推荐
相关产品推荐

