使用 java 和 Selenium 通过代理丰富 headers

Enriching headers via a proxy using java and Selenium

我正在使用 Selenium、Java 和 testNG 开发自动化 Web 测试堆栈。 出于身份验证和安全原因,我需要丰富我通过 Kubernetes 访问的网站的 headers。 例如,我可以在终端中成功使用此 CURL 命令检索我要访问的页面:curl -H 'Host: staging.myapp.com' -H 'X-Forwarded-Proto: https' http://nginx.myapp.svc.cluster.local。 因此,如您所见,我只需要为 Host 添加 2 headers 和 X-Forwarded-Proto.

我正在尝试创建一个代理,它将在我的 @BeforeMethod 方法中丰富 headers 几天,但我仍然卡住了,而且有太多的阴影区域我找不到调试任何东西并了解问题所在的方法。现在,无论我的代码如何,当我启动它时,我的 driver 中总是出现“无互联网”(ERR_PROXY_CONNECTION_FAILED) 错误页面。

比如我的一个版本的代码:

        BrowserMobProxy browserMobProxy = new BrowserMobProxyServer();
        browserMobProxy.setTrustAllServers(true);
        browserMobProxy.addHeader("Host", "staging.myapp.com");
        browserMobProxy.addHeader("X-Forwarded-Proto", "https");
        browserMobProxy.start();

        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.setProxy(ClientUtil.createSeleniumProxy(browserMobProxy));
        driver = new ChromeDriver(chromeOptions);
        driver.get("http://nginx.myapp.svc.cluster.local");

我尝试了其他几种代码结构,例如:

但是没有任何效果,我总是得到 ERR_PROXY_CONNECTION_FAILED。 有人对此有任何线索吗?谢谢!

好的,经过几天的研究,我发现了两件事:

  • 由于我 Mac 上的任何配置,我需要强制主机地址(其他人 运行 相同的代码没有问题...):

proxy.setHttpProxy(Inet4Address.getLocalHost().getHostAddress() + ":" + browserMobProxyServer.getPort());

  • 我必须通过响应过滤器手动更改 headers,而不是使用 .addHeader 方法:

browserMobProxyServer.addResponseFilter((response, content, messageInfo)->{

//Do something here related to response.headers()

});

希望能对这里迷失的灵魂有所帮助。