JMeter WebDriver Sampler实现Windows/Basic认证遇阻求助
问题
使用JMeter 5.5,搭配Selenium WebDriver 4.13.0、Firefox 122.0浏览器及Groovy语言,通过WebDriver Sampler执行Windows/Basic认证场景时无法通过授权,已尝试以下方法均失败:
- URL传递凭证:该方式已废弃
- DevTools方法:代码及报错如下
报错:DevTools devTools = WDS.browser.getDevTools(); devTools.createSession(); devTools.send(Network.enable(Optional.of(10000), Optional.of(10000), Optional.of(10000))); def auth = "admin:admin!"; String encodeToString = Base64.getEncoder().encodeToString(auth.getBytes()); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("Authorization","Basic "+encodeToString); devTools.send(Network.setExtraHTTPHeaders(new Header(headers)));ERROR c.g.j.p.w.s.WebDriverSampler: javax.script.ScriptException: org.openqa.selenium.devtools.DevToolsException: You are using a no-op implementation of the CDP. The most likely reason for this is that Selenium was unable to find an implementation of the CDP protocol that matches your browser. Please be sure to include an implementation on the classpath, possibly by adding a new (maven) dependency of org.seleniumhq.selenium:selenium-devtools-vNN:4.13.0 where NN matches the major version of the browser you're using. - HasAuthentication方法:代码及报错如下
报错:Predicate<URI> uriPredicate = uri -> uri.toString().contains(url); Supplier<Credentials> authentication = UsernameAndPassword.of("admin", "admin!"); ((HasAuthentication) WDS.browser).register(uriPredicate, authentication); WDS.browser.get(url);ERROR c.g.j.p.w.s.WebDriverSampler: javax.script.ScriptException: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'FirefoxDriver: firefox on windows (bbbfeb27-327f-4ad3-a18b-2c70c23059c9)' with class 'org.openqa.selenium.firefox.FirefoxDriver' to class 'org.openqa.selenium.HasAuthentication'
解决方案
一、修复DevTools方法
报错核心是缺少对应Firefox版本的CDP实现依赖。Firefox 122对应CDP版本为v122,需补充匹配的依赖包:
- 下载
selenium-devtools-v122-4.13.0.jar(版本需与你的Selenium WebDriver 4.13.0完全一致) - 将jar包放入JMeter安装目录下的
lib/ext文件夹 - 重启JMeter生效
修改后的可运行代码:
import org.openqa.selenium.devtools.network.Network import org.openqa.selenium.devtools.network.model.Header import java.util.Optional import java.util.Base64 DevTools devTools = WDS.browser.getDevTools(); devTools.createSession(); devTools.send(Network.enable(Optional.of(10000), Optional.of(10000), Optional.of(10000))); def auth = "admin:admin!"; String encodeToString = Base64.getEncoder().encodeToString(auth.getBytes()); Map<String, Object> headers = new HashMap<>(); headers.put("Authorization","Basic "+encodeToString); devTools.send(Network.setExtraHTTPHeaders(new Header(headers))); WDS.browser.get(url);
二、修复HasAuthentication方法
FirefoxDriver并未直接实现HasAuthentication接口,需通过DevTools监听认证请求并主动返回凭证,替代代码如下:
import org.openqa.selenium.devtools.DevTools import org.openqa.selenium.devtools.network.Network import org.openqa.selenium.devtools.network.model.AuthChallengeResponse DevTools devTools = WDS.browser.getDevTools(); devTools.createSession(); devTools.send(Network.enable(null, null, null)); // 监听认证请求,自动返回凭证 devTools.addListener(Network.authRequired(), challenge -> { devTools.send(Network.continueInterceptedRequest( challenge.getRequestId(), null, null, null, AuthChallengeResponse.action("ProvideCredentials"), "admin", "admin!", null, null )); }); WDS.browser.get(url);
三、其他有效替代方案
AutoIt脚本自动填充弹窗
编写AutoIt脚本处理系统级认证弹窗,在JMeter中调用执行:
AutoIt脚本示例:WinWaitActive("Authentication Required") Send("admin{TAB}") Send("admin!{ENTER}")JMeter中调用代码:
Runtime.getRuntime().exec("C:/path/to/your/auth_script.exe") WDS.browser.get(url);预配置Firefox保存凭证
在Firefox配置文件中提前保存目标站点的Basic认证信息,JMeter启动Firefox时加载该配置文件:- 手动打开Firefox,访问目标站点并保存认证凭证
- 找到Firefox配置文件路径(地址栏输入
about:profiles查看) - 在JMeter的WebDriver配置中,将FirefoxProfile路径指向该配置文件
内容的提问来源于stack exchange,提问作者Dhanush V
相关产品推荐
相关产品推荐

