Selenium 4 HasAuthentication正常模式失效及默认登录问题咨询
Selenium 4迁移后HasAuthentication使用问题及排查
背景
我们近期将Selenium脚本从Selenium 3.141.x + JDK 1.8迁移至Selenium 4.18.1 + JDK 17。Web应用包含多角色,每个角色对应独立登录账号密码。
原Selenium 3中通过URL传参登录:driver.get("https://username:password@environmentname.enterprise.sok.dev/"),部分场景用Robot类处理登录弹窗。迁移后计划用HasAuthentication替代URL传参,核心代码如下:
// 配置文件中存储加密的账号密码,运行时解密 String propertyUserName = EncryptedURL.getUserName(environment, userrole); String propertyPassword = EncryptedURL.getPassword(environment, userrole); // 注:原代码此处误写为getUserName,已修正 WebDriver driver; System.setProperty("webdriver.chrome.driver", "CHROMEDRIVER_PATH"); ChromeOptions cOptions = new ChromeOptions(); cOptions.addArguments("--disable-setuid-sandbox"); cOptions.addArguments("--disable-web-security"); cOptions.addArguments("--ignore-certificate-errors"); cOptions.addArguments("--allow-running-insecure-content"); cOptions.addArguments("--disable-extensions"); cOptions.addArguments("--incognito"); driver = new ChromeDriver(cOptions); driver.manage().deleteAllCookies(); driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(180)); ((HasAuthentication) driver).register( uri -> uri.getHost().contains("enterprise.sok.dev"), // 注:原代码拼写错误enteprise修正为enterprise () -> new UsernameAndPassword(propertyUserName, propertyPassword) ); driver.manage().window().maximize(); // 注:原代码timeouts.maximize()错误,修正为window().maximize() driver.get("https://environmentname.enterprise.sok.dev/");
当前使用Chrome 122稳定版,Maven依赖:
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-devtools-v122</artifactId> <version>4.18.1</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.18.1</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chrome-driver</artifactId> <version>4.18.1</version> </dependency>
遇到的问题
- Chrome隐身模式下,HasAuthentication传入的凭证可正常登录;关闭隐身模式(正常模式)后,脚本不使用传入的凭证,自动以"FAAdmin"账号登录。
- 手动打开Chrome访问目标URL,即使「自动填充和密码」无存储密码,仍自动以"FAAdmin"账号登录。
问题解答
1. 如何让正常模式下的脚本使用HasAuthentication传入的凭证?
HasAuthentication依赖Chrome DevTools的Network.setAuthOverride能力,正常模式下浏览器的缓存、会话数据会干扰认证逻辑,可通过以下步骤解决:
- 指定全新用户数据目录:避免加载原有用户的缓存数据,在ChromeOptions中添加:
确保该目录为空且脚本有读写权限,启动时不会复用原有会话。cOptions.addArguments("--user-data-dir=/path/to/new/empty/directory"); - 禁用自动登录相关特性:添加参数屏蔽密码管理、自动填充逻辑:
cOptions.addArguments("--disable-password-manager-reauthentication"); cOptions.addArguments("--disable-save-password-bubble"); cOptions.addArguments("--disable-credentials-manager"); - 修正代码错误:原代码存在拼写错误(
enteprise.sok.dev→enterprise.sok.dev)、方法调用错误(timeouts.maximize()→window().maximize())、密码获取错误(getUserName→getPassword),这些错误会导致认证逻辑未正确触发,需先修正。 - 检查DevTools兼容性:确保未禁用DevTools相关参数,移除可能干扰的
--disable-web-security(若业务允许),该参数可能影响DevTools的认证覆盖功能。
2. 无密码存储时自动登录的"FAAdmin"凭证来源何处?
可能的来源包括:
- 系统级凭证管理器:Windows凭据管理器、macOS钥匙串访问、Linux GNOME密钥环中可能存储了该站点的认证凭证,即使Chrome自动填充关闭,系统仍会自动提供。
- 浏览器隐藏缓存:正常模式的Chrome用户目录中,可能存在未在「自动填充和密码」显示的HTTP-only Cookie或认证令牌,这些会被自动携带。
- 企业SSO配置:作为金融机构,可能部署了企业级单点登录(如ADFS、Okta),浏览器通过系统集成的SSO客户端自动注入"FAAdmin"凭证。
- 企业管理扩展:部分后台运行的企业级扩展可能自动填充认证信息,可通过
--disable-extensions和--disable-plugins彻底禁用。
验证方法:
- 打开系统凭证管理器,搜索目标域名检查是否存在相关凭证。
- 查看Chrome的
chrome://settings/passwords和chrome://settings/autofill页面,确认隐藏的保存条目。 - 打开Chrome开发者工具→网络面板,访问目标URL时查看请求头的
Authorization字段或Cookie,追踪凭证来源。
内容的提问来源于stack exchange,提问作者Ramkumar
相关产品推荐
相关产品推荐

