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

Selenide代理添加请求报头失败问题及替代方案咨询

问题1:你的操作错误点
  • 代理配置时机太晚:你先调用了open(),这时候WebDriver已经启动并尝试连接目标站点了,之后才去获取代理设置请求头,时序完全错了。必须在打开任何页面之前就完成代理的配置和启动。
  • 未启动代理服务:BrowserUpProxy实例需要手动启动,否则浏览器找不到可用的代理端口,直接报连接失败。
  • 依赖版本冲突:你手动指定了netty的版本(4.1.54.Final),但BrowserUpProxy 2.1.2和Selenide 5.16.1可能依赖其他版本的netty,版本冲突会导致代理服务无法正常启动。

修正后的代码示例

先移除pom里手动添加的netty依赖(让依赖管理自动处理兼容版本),然后调整测试代码的时序:

<!-- 修改后的pom依赖,移除手动的netty配置 -->
<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.9.2</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.9.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.codeborne</groupId>
        <artifactId>selenide</artifactId>
        <version>5.16.1</version>
    </dependency>
    <dependency>
        <groupId>com.browserup</groupId>
        <artifactId>browserup-proxy-core</artifactId>
        <version>2.1.2</version>
    </dependency>
</dependencies>
import com.browserup.bup.BrowserUpProxy;
import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.WebDriverRunner;
import org.junit.jupiter.api.Test;

public class ProxyTest {

    @Test
    void test() {
        // 1. 先启用代理
        Configuration.proxyEnabled = true;
        Configuration.baseUrl = "https://stackoverflow.com/";

        // 2. 初始化并启动代理,添加请求头
        BrowserUpProxy proxy = WebDriverRunner.getSelenideProxy().getProxy();
        proxy.addHeader("test", "test");
        proxy.start(); // 显式启动代理服务

        // 3. 最后打开页面
        open("/"); // 用baseUrl拼接,避免重复写完整地址
    }
}
问题2:其他实现方案

方案1:加载浏览器扩展(如ModHeader)

本地用ModHeader手动操作可行,自动化测试里可以加载扩展文件来自动设置请求头:

import com.codeborne.selenide.Configuration;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.chrome.ChromeOptions;
import java.io.File;

public class ExtensionHeaderTest {

    @Test
    void testWithExtension() {
        ChromeOptions options = new ChromeOptions();
        // 加载本地的ModHeader扩展文件(.crx格式)
        options.addExtensions(new File("path/to/modheader.crx"));
        
        // 直接通过启动参数设置请求头(需对应ModHeader的参数格式)
        options.addArguments("--modheader=test:test");

        Configuration.browserCapabilities = options;
        Configuration.baseUrl = "https://stackoverflow.com/";
        
        open("/");
    }
}

方案2:使用Chrome DevTools Protocol(CDP)设置请求头

适合Chrome/Edge浏览器,无需代理,直接通过CDP注入请求头:

import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.WebDriverRunner;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.v89.network.Network;

import java.util.HashMap;
import java.util.Map;

public class CDPHeaderTest {

    @Test
    void testWithCDP() {
        Configuration.browser = "chrome";
        Configuration.baseUrl = "https://stackoverflow.com/";

        // 初始化Driver后获取DevTools
        ChromeDriver driver = (ChromeDriver) WebDriverRunner.getWebDriver();
        DevTools devTools = driver.getDevTools();
        devTools.createSession();

        // 设置请求头
        Map<String, String> headers = new HashMap<>();
        headers.put("test", "test");
        devTools.send(Network.setExtraHTTPHeaders(new Network.SetExtraHTTPHeadersRequest(headers)));

        open("/");
    }
}

方案3:自定义Selenide的WebDriverProvider

通过自定义Driver配置,在初始化时添加请求头(仅部分浏览器支持此方式):

import com.codeborne.selenide.WebDriverProvider;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import javax.annotation.Nonnull;
import java.util.HashMap;
import java.util.Map;

public class CustomDriverProvider implements WebDriverProvider {

    @Nonnull
    @Override
    public WebDriver createDriver(@Nonnull com.codeborne.selenide.Browser browser) {
        ChromeOptions options = new ChromeOptions();
        // 设置请求头(仅部分浏览器支持该实验性配置)
        Map<String, Object> prefs = new HashMap<>();
        prefs.put("network.http.headers.test", "test");
        options.setExperimentalOption("prefs", prefs);

        return new ChromeDriver(options);
    }
}

然后在测试代码里指定这个Provider:Configuration.browser = "com.your.package.CustomDriverProvider";

内容的提问来源于stack exchange,提问作者Andrey Nazarov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:58:07