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
相关产品推荐
相关产品推荐

