You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:55:27