使用 ChromeDriver 设置 browsermob 代理
Setting up browsermob proxy with ChromeDriver
我正在尝试设置 browsermob 以在我的 selenium 项目中工作。我一直在寻找一种使用 ChromeOptions 设置代理的方法,但所有消息来源都告诉我对其他所有内容都使用 ChromeOptions,然后在实例化新的 ChromeDriver 实例之前将其转换为 DesiredCapabilities。
这是我的代码:
ChromeOptions options = new ChromeOptions();
// Setting some chrome features here
ProxyServer proxyServer = new ProxyServer(4444);
proxyServer.start();
Proxy proxy = proxyServer.seleniumProxy();
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
capabilities.setCapability(CapabilityType.PROXY, proxy);
WebDriver driver = new ChromeDriver(capabilities); // Error happens here
我正在使用 Maven 存储库中的 Webdriver 2.44 版。这是我得到的错误:
java.lang.IllegalAccessError: tried to access field com.google.gson.JsonNull.INSTANCE from class org.openqa.selenium.remote.BeanToJsonConverter
有谁知道将代理连接到 chromedriver 的原因或任何替代解决方案?
如果您使用的是旧版本的 browsermob-proxy,Selenium 的依赖项和 BMP 的依赖项之间可能存在一些冲突。我建议使用最新的 Selenium + 从 master.
构建 latest BrowserMob Proxy
获得最新版本后,您应该能够以 "usual" 方式使用 Chrome + BMP:
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.start(); // can specify a port here if you like
// get the selenium proxy object
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
// if chromedriver isn't on your system path, you'll need to set this system property
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
WebDriver driver = new ChromeDriver(capabilities);
driver.get("https://www.google.com/");
ChromeDriver 不直接支持代理上限。但确实如此
支持将命令行参数传递给 chrome 进程。和设置
http 代理是 chrome 命令行开关之一。可以设置
如下:
DesiredCapabilities caps = DesiredCapabilities.chrome();
ArrayList<String> switches = new ArrayList<String>();
switches.add("--proxy-server=localhost:8080");
caps.setCapability("chrome.switches", switches);
webDriver = new ChromeDriver(caps);
Browsermob-Proxy
是一个可靠的解决方案,但是在使用远程网格机器时,Browsermob-proxy 并不是很有帮助。或者,我发现这是我的设置的有效解决方案。
希望对具有类似设置的人有用。
- 将 ModHeader 扩展添加到 chrome 浏览器
如何下载Modheader? Link
ChromeOptions options = new ChromeOptions();
options.addExtensions(new File(C://Downloads//modheader//modheader.crx));
// Set the Desired capabilities
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
// Instantiate the chrome driver with capabilities
WebDriver driver = new RemoteWebDriver(new URL(YOUR_HUB_URL), options);
- 转到浏览器扩展并捕获 ModHeader 的本地存储上下文 ID
- 导航到 ModHeader 的 URL 以设置本地存储上下文
.
// set the context on the extension so the localStorage can be accessed
driver.get("chrome-extension://idgpnmonknjnojddfkpgkljpfnnfcklj/_generated_background_page.html");
Where `idgpnmonknjnojddfkpgkljpfnnfcklj` is the value captured from the Step# 2
- 现在使用
Javascript
将 headers 添加到请求中
.
((Javascript)driver).executeScript(
"localStorage.setItem('profiles', JSON.stringify([{ title: 'Selenium', hideComment: true, appendMode: '',
headers: [
{enabled: true, name: 'token-1', value: 'value-1', comment: ''},
{enabled: true, name: 'token-2', value: 'value-2', comment: ''}
],
respHeaders: [],
filters: []
}]));");
其中 token-1
、value-1
、token-2
、value-2
是请求 headers 和要添加的值。
现在导航到所需的 web-application。
driver.get("your-desired-website");
我正在尝试设置 browsermob 以在我的 selenium 项目中工作。我一直在寻找一种使用 ChromeOptions 设置代理的方法,但所有消息来源都告诉我对其他所有内容都使用 ChromeOptions,然后在实例化新的 ChromeDriver 实例之前将其转换为 DesiredCapabilities。
这是我的代码:
ChromeOptions options = new ChromeOptions();
// Setting some chrome features here
ProxyServer proxyServer = new ProxyServer(4444);
proxyServer.start();
Proxy proxy = proxyServer.seleniumProxy();
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
capabilities.setCapability(CapabilityType.PROXY, proxy);
WebDriver driver = new ChromeDriver(capabilities); // Error happens here
我正在使用 Maven 存储库中的 Webdriver 2.44 版。这是我得到的错误:
java.lang.IllegalAccessError: tried to access field com.google.gson.JsonNull.INSTANCE from class org.openqa.selenium.remote.BeanToJsonConverter
有谁知道将代理连接到 chromedriver 的原因或任何替代解决方案?
如果您使用的是旧版本的 browsermob-proxy,Selenium 的依赖项和 BMP 的依赖项之间可能存在一些冲突。我建议使用最新的 Selenium + 从 master.
构建 latest BrowserMob Proxy获得最新版本后,您应该能够以 "usual" 方式使用 Chrome + BMP:
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.start(); // can specify a port here if you like
// get the selenium proxy object
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
// if chromedriver isn't on your system path, you'll need to set this system property
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
WebDriver driver = new ChromeDriver(capabilities);
driver.get("https://www.google.com/");
ChromeDriver 不直接支持代理上限。但确实如此 支持将命令行参数传递给 chrome 进程。和设置 http 代理是 chrome 命令行开关之一。可以设置 如下:
DesiredCapabilities caps = DesiredCapabilities.chrome();
ArrayList<String> switches = new ArrayList<String>();
switches.add("--proxy-server=localhost:8080");
caps.setCapability("chrome.switches", switches);
webDriver = new ChromeDriver(caps);
Browsermob-Proxy
是一个可靠的解决方案,但是在使用远程网格机器时,Browsermob-proxy 并不是很有帮助。或者,我发现这是我的设置的有效解决方案。
希望对具有类似设置的人有用。
- 将 ModHeader 扩展添加到 chrome 浏览器
如何下载Modheader? Link
ChromeOptions options = new ChromeOptions();
options.addExtensions(new File(C://Downloads//modheader//modheader.crx));
// Set the Desired capabilities
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
// Instantiate the chrome driver with capabilities
WebDriver driver = new RemoteWebDriver(new URL(YOUR_HUB_URL), options);
- 转到浏览器扩展并捕获 ModHeader 的本地存储上下文 ID
- 导航到 ModHeader 的 URL 以设置本地存储上下文
.
// set the context on the extension so the localStorage can be accessed
driver.get("chrome-extension://idgpnmonknjnojddfkpgkljpfnnfcklj/_generated_background_page.html");
Where `idgpnmonknjnojddfkpgkljpfnnfcklj` is the value captured from the Step# 2
- 现在使用
Javascript
将 headers 添加到请求中
.
((Javascript)driver).executeScript(
"localStorage.setItem('profiles', JSON.stringify([{ title: 'Selenium', hideComment: true, appendMode: '',
headers: [
{enabled: true, name: 'token-1', value: 'value-1', comment: ''},
{enabled: true, name: 'token-2', value: 'value-2', comment: ''}
],
respHeaders: [],
filters: []
}]));");
其中 token-1
、value-1
、token-2
、value-2
是请求 headers 和要添加的值。
现在导航到所需的 web-application。
driver.get("your-desired-website");