Chrome 65升级后driver.get(url)阻塞,Sikuli无法自动处理凭证弹窗求方案
首先,你遇到的核心问题是Chrome 65升级后,HTTP基本认证弹窗在driver.get(url)执行时立刻弹出,导致Selenium直接阻塞在这一行,根本没机会走到后面的Sikuli处理代码。下面给你几个可行的解决方案,按优先级排序:
1. 直接在URL中嵌入凭证(最简单高效)
这是绕开认证弹窗最直接的方式,把用户名和密码直接拼进目标URL,格式如下:
url = "http://your_username:your_password@target-domain.com/path" driver.get(url)
Chrome会自动解析URL里的凭证信息,直接完成认证,不会弹出任何窗口。不过要注意:
- 这种方式会把密码明文暴露在日志、代码仓库或浏览器地址栏(部分场景下),如果是生产环境或涉及敏感密码,谨慎使用。
- 部分服务器或安全配置可能禁用这种URL嵌入凭证的方式,需要先测试验证。
2. 提前启动Sikuli线程处理弹窗
既然弹窗是在driver.get(url)执行时立刻出现的,你可以用多线程的方式,在调用driver.get之前先启动一个Sikuli线程,让它等待弹窗出现并完成输入操作。示例代码(以Python为例):
import threading import time from sikuli import * def handle_auth_popup(): # 等待弹窗加载(可根据实际情况调整等待时长) time.sleep(2) # 定位用户名输入框并输入 click("username_field.png") type("your_username") # 定位密码输入框并输入 click("password_field.png") type("your_password") # 点击确认按钮 click("submit_button.png") # 先启动处理弹窗的线程 popup_thread = threading.Thread(target=handle_auth_popup) popup_thread.start() # 再执行页面跳转 driver.get(url) # 等待线程执行完成 popup_thread.join()
这种方式保留了你原本的Sikuli操作逻辑,只需要调整执行顺序,就能避免Selenium被弹窗阻塞。
3. 确保Chromedriver与Chrome版本匹配
你提到使用的Chromedriver是2.67,但Chrome 65对应的Chromedriver版本应该是2.37或2.38(Chromedriver和Chrome版本是严格匹配的,大版本差异会导致各种兼容性问题)。版本不兼容可能是弹窗处理逻辑异常的根源,比如Selenium无法正确感知弹窗的出现时机。
建议你替换为对应Chrome 65的Chromedriver版本后再测试,这可能解决一些隐藏的兼容性问题。
4. 使用Chrome扩展自动填充认证信息
你可以开发一个简单的Chrome扩展,在页面加载前自动注入认证信息。扩展的核心逻辑是监听webRequest.onAuthRequired事件,返回凭证信息:
chrome.webRequest.onAuthRequired.addListener( function(details) { return { authCredentials: {username: "your_username", password: "your_password"} }; }, {urls: ["<all_urls>"]}, ["blocking"] );
然后通过ChromeOptions加载这个扩展:
from selenium import webdriver options = webdriver.ChromeOptions() options.add_extension("path/to/your/auth-extension.crx") driver = webdriver.Chrome(chrome_options=options) driver.get(url)
这种方式适合需要长期稳定处理认证弹窗的场景,安全性比URL嵌入更高。
内容的提问来源于stack exchange,提问作者VIgnesh

