Selenium运行报MaxRetryError/WinError10061目标机器主动拒绝连接如何解决
问题原因
- 核心错误来自你的
try-finally代码块逻辑错误:无论WebDriverWait是否成功定位到SENECA01元素,finally块都会执行driver.quit()直接关闭浏览器、断开Selenium驱动连接,后续再调用driver.find_element时已经没有可用的驱动进程,就会抛出连接被拒绝的报错。 - 次要问题:你使用的
presence_of_element_located仅判断元素是否存在于DOM树中,不保证元素可见、可点击,即使等到元素也可能出现点击失效、误点其他元素的情况。 - 其他语法兼容问题:你使用的
find_element_by_*、chrome_options参数在Selenium 4.0+版本中已经被弃用,可能会出现额外警告。
解决方案
修正逻辑,等待到元素可点击后直接操作,所有流程执行完成或出现异常时再统一关闭驱动,修正后的代码如下:
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from getpass import getpass from selenium.webdriver.common.by import By import time opt = Options() opt.add_argument("--disable-infobars") opt.add_argument("start-maximized") opt.add_argument("--disable-extensions") # 1代表允许权限 2代表拒绝权限 opt.add_experimental_option("prefs", { "profile.default_content_setting_values.media_stream_mic": 1, "profile.default_content_setting_values.media_stream_camera": 1, "profile.default_content_setting_values.geolocation": 1, "profile.default_content_setting_values.notifications": 1 }) PATH = "C:\\Users\\me\\AppData\\Local\\Programs\\Python\\Python39\\chromedriver.exe" # 弃用chrome_options参数,改用options driver = webdriver.Chrome(executable_path=PATH, options=opt) try: driver.get("https://xxxx.xxx-xxx.org/logon/login") print(driver.title) username = input("Enter in your username: ") password = getpass("Enter your password: ") # 统一使用官方推荐的find_element写法 username_textbox = driver.find_element(By.ID, "username") username_textbox.send_keys(username) password_textbox = driver.find_element(By.ID, "password") password_textbox.send_keys(password) login_button = driver.find_element(By.CLASS_NAME, "formstylebut") login_button.submit() link = driver.find_element(By.LINK_TEXT, "Big Data (CAD)") link.click() link = driver.find_element(By.LINK_TEXT, "Run a Report") link.click() # 改用element_to_be_clickable确保元素加载完成、可交互 element = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.LINK_TEXT, "SENECA01")) ) # 直接使用等待返回的元素点击,无需重复查找 element.click() # 后续下载逻辑可在此处继续编写 except Exception as e: print(f"运行出现错误:{e}") finally: # 所有逻辑执行完成/出现异常后再统一关闭驱动 driver.quit()
核心修改说明
- 把所有业务流程都包裹在统一的异常捕获块中,仅在流程结束或报错时才关闭驱动,避免提前断开连接
- 将显式等待的判断条件改为
element_to_be_clickable,确保元素完全加载可交互后再执行点击,解决误点其他元素的问题 - 统一使用Selenium 4.0+官方推荐的元素查找写法,兼容新版本,避免弃用警告
- 等待到元素后直接使用返回的元素对象执行操作,不需要重复查找元素,减少出错概率
内容的提问来源于stack exchange,提问作者Optik
相关产品推荐
相关产品推荐

