Python Selenium Edge点击按钮后Basic Auth弹窗处理超时问题求助
解决方案
1. 修改页面加载策略,解决click()超时问题
点击报告链接触发的Basic Auth弹窗属于系统级对话框,会中断页面加载流程,导致Selenium默认等待页面完全加载时超时。先调整Edge的页面加载策略,跳过全量页面等待:
from selenium import webdriver from selenium.webdriver.edge.options import Options # 初始化Edge选项,设置页面加载策略为'eager'(仅等待DOM加载完成) edge_options = Options() edge_options.page_load_strategy = 'eager' # 也可设为'none',完全不等待页面加载,更适配弹窗场景 # edge_options.page_load_strategy = 'none' driver = webdriver.Edge(options=edge_options) # 执行登录流程... # 此时点击报告链接不会因页面加载卡住 reportBt.click()
2. 通过CDP预注入Authorization请求头(推荐)
Basic Auth本质是HTTP请求头验证,直接给报告请求注入认证头,从根源避免弹窗弹出:
import base64 from selenium import webdriver # 结合上述页面加载策略初始化driver driver = webdriver.Edge(options=edge_options) # 执行登录步骤... # 生成Basic Auth的base64编码串 username = "你的账号" password = "你的密码" auth_token = base64.b64encode(f"{username}:{password}".encode('utf-8')).decode('utf-8') # 使用Chrome DevTools Protocol设置全局请求头,携带认证信息 driver.execute_cdp_cmd( 'Network.setExtraHTTPHeaders', {'headers': {'Authorization': f'Basic {auth_token}'}} ) # 点击报告链接,请求自动带上认证头,不会触发弹窗 reportBt.click()
3. 用pywin32直接控制系统认证弹窗
如果前两种方法无效,用Windows API直接定位并操作弹窗,比AutoIT更稳定:
先安装依赖:pip install pywin32
import win32gui import win32api import win32con import time def fill_basic_auth(username, password): time.sleep(1.5) # 等待弹窗渲染完成 # 替换为你的弹窗标题,中文通常是"需要认证",英文为"Authentication Required" dialog_hwnd = win32gui.FindWindow(None, "需要认证") if not dialog_hwnd: return # 定位用户名输入框(第一个Edit控件) username_input = win32gui.FindWindowEx(dialog_hwnd, None, "Edit", None) win32gui.SendMessage(username_input, win32con.WM_SETTEXT, 0, username) # 定位密码输入框(第二个Edit控件) password_input = win32gui.FindWindowEx(dialog_hwnd, username_input, "Edit", None) win32gui.SendMessage(password_input, win32con.WM_SETTEXT, 0, password) # 定位确定按钮并点击 confirm_btn = win32gui.FindWindowEx(dialog_hwnd, None, "Button", "确定") win32api.SendMessage(dialog_hwnd, win32con.WM_COMMAND, 1, confirm_btn) # 执行登录步骤... reportBt.click() # 调用函数处理弹窗 fill_basic_auth("你的账号", "你的密码")
注意事项
- 若弹窗标题不是"需要认证",可使用
win32gui.EnumWindows遍历窗口获取准确标题; - CDP方法需确保报告链接域名与当前页面一致,否则需单独给对应域名设置请求头;
- 页面加载策略设为'none'后,后续元素操作需手动添加
WebDriverWait等待,避免元素未就绪。
内容的提问来源于stack exchange,提问作者Arasan
相关产品推荐
相关产品推荐

