OAuth2.0授权码流:JMeter提取跳转消失的回调URL授权码方案咨询
方案1:优化WebDriver采样器的URL捕获时机
因为跳转速度太快,常规提取方式赶不上,你可以通过WebDriver的事件监听或主动轮询逻辑,在跳转完成前拿到带code的回调地址:
- 在WebDriver采样器的Groovy脚本中添加URL拦截逻辑:
import org.openqa.selenium.support.events.WebDriverListener import org.openqa.selenium.WebDriver import org.openqa.selenium.By def targetCode = null // 注册URL跳转前的监听 def listener = new WebDriverListener() { @Override void beforeNavigateTo(String url, WebDriver driver) { if (url.contains("code=")) { // 提取code参数(截断到下一个&符号) targetCode = url.split("code=")[1].split("&")[0] // 可选:拿到code后强制停止跳转,避免后续页面加载干扰 driver.executeScript("window.stop();") } } } driver.register(listener) // 执行你的登录操作(替换成实际的元素定位和输入逻辑) driver.findElement(By.id("username")).sendKeys("your_username") driver.findElement(By.id("password")).sendKeys("your_password") driver.findElement(By.cssSelector("button[type='submit']")).click() // 等待code被捕获,设置10秒超时 def wait = new org.openqa.selenium.support.ui.WebDriverWait(driver, java.time.Duration.ofSeconds(10)) wait.until({ targetCode != null }) // 将code存入JMeter变量,供后续请求使用 vars.put("authorization_code", targetCode) - 核心逻辑:通过
beforeNavigateTo事件在浏览器跳转前拦截URL,一旦检测到包含code=的地址就立即提取,确保不会因为跳转丢失参数。
方案2:用JMeter HTTP(S) Test Script Recorder捕获重定向请求
如果WebDriver的方式仍不生效,直接用JMeter的代理录制工具捕获整个授权流程的网络请求,带code的重定向请求会被Recorder完整记录:
配置Recorder:
- 在JMeter测试计划下添加「HTTP(S) Test Script Recorder」
- 设置监听端口(如8888),在「Requests Filtering」标签页排除静态资源(
.css、.js、.png等),减少冗余请求 - 点击「Start」启动录制,按照提示安装JMeter根证书(否则无法捕获HTTPS请求)
配置浏览器代理:
- 打开测试浏览器,设置HTTP代理为
localhost:8888,与Recorder端口保持一致
- 打开测试浏览器,设置HTTP代理为
执行授权流程:
- 在浏览器中访问授权入口,完成登录操作,直到跳转到用户详情页
- 停止Recorder,此时测试计划会生成所有捕获的请求,找到那个URL包含
code=的重定向请求(通常是GET请求,状态码为3xx)
提取Authorization Code:
- 在该重定向请求下添加「正则表达式提取器」
- 配置参数:
- 引用名称:
authorization_code - 正则表达式:
code=([^&]+) - 模板:
$1$ - 匹配数字:
1
- 引用名称:
- 后续请求可通过
${authorization_code}直接引用该变量
方案3:通过WebDriver获取浏览器网络日志提取code
主流浏览器支持导出网络请求日志,你可以在WebDriver中启用日志,解析日志找到带code的请求:
- 在WebDriver采样器中添加日志解析逻辑(以Chrome为例):
import org.openqa.selenium.chrome.ChromeOptions import org.openqa.selenium.logging.LogType import groovy.json.JsonSlurper // 启用Chrome性能日志 def options = new ChromeOptions() options.setCapability("goog:loggingPrefs", [(LogType.PERFORMANCE): "ALL"]) def driver = new org.openqa.selenium.chrome.ChromeDriver(options) // 执行授权登录流程 driver.get("your_auth_login_page_url") // ... 替换为实际的登录操作代码 ... // 遍历性能日志,查找带code的请求 def logEntries = driver.manage().logs().get(LogType.PERFORMANCE) def code = null def slurper = new JsonSlurper() for (def entry : logEntries) { def logData = slurper.parseText(entry.getMessage()) def requestUrl = logData.message?.params?.request?.url if (requestUrl?.contains("code=")) { code = requestUrl.split("code=")[1].split("&")[0] break } } // 存入JMeter变量 if (code) { vars.put("authorization_code", code) } driver.quit() - 注意:Firefox等其他浏览器的日志配置略有差异,需对应调整
capability参数。
内容的提问来源于stack exchange,提问作者RaviM
相关产品推荐
相关产品推荐

