如何使用代理运行selenium铬节点?

我使用Docker Selenium映像运行浏览器节点,repo可以在这里https://github.com/SeleniumHQ/docker-selenium 。 没有关于如何使用config.json来提供代理值的文档。

我使用Selenium版本2.44.0。

在我的基础架构中,某些资源来源于需要在浏览器上进行代理configuration才能访问的位置。 我正在尝试在chrome节点上设置代理。 根据这里的文档 ,代理可以设置如下:

java -jar selenium-2.44.0.jar -Dhttp.proxyHost=192.168.2.10 -Dhttp.proxyPort=80 

我的代理不需要使用用户名和密码,因此我忽略了这些值。 SeleniumHQ文档中没有明确提到的是,无论是在集线器还是节点上,还是仅在节点上,都需要代理configuration。 我尝试了不同的组合,但没有为我工作。

我正在运行的实际命令是:

对于Hub:

 java -jar /opt/selenium/selenium-server-standalone.jar -role hub -Dhttp.proxyHost=192.168.2.10 -Dhttp.proxyPort=80 -hubConfig /opt/selenium/hubconfig.json 

当我运行上面的命令,我可以看到-D *值显示在控制台configuration。

对于节点:

 xvfb-run --server-args=":99.0 -screen 0 1360x1020x24 -ac +extension RANDR" java -jar /opt/selenium/selenium-server-standalone.jar -Dhttp.proxyHost=192.168.2.10 -Dhttp.proxyPort=80 -role node -hub http://$HUB_PORT_4444_TCP_ADDR:$HUB_PORT_4444_TCP_PORT/grid/register -nodeConfig /opt/selenium/config.json 

当我运行这个命令时,我可以再次在控制台上看到代理值,但是我的资源没有被浏览器加载。

另外,在一个侧面说明,这似乎可以在开发人员方面( 在Java代码 )完成,但我很想在我的(操作)方面解决它。

谢谢 – 这是我们得到的:

首先你需要一种方法来validation你的设置进入浏览器 。

铬://net-internals/proxyservice.config#proxy

实际的命令行指令是:

 /chromeexec --proxy="http=http://proxyserver:port/;https=http://proxyserver:port/" 

请注意,如果不使用双引号,冒号就会在bash命令行中爆炸。

现在,如果您以编程方式从Webdriver Java代码发送此代码 – 您需要避开双引号 – 所以Java中的代理服务器设置可能如下所示:

 org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy(); proxy.setHttpProxy("\"http://proxyserver:port/\"") 

或者,您可以将其作为执行参数传入。

 DesiredCapabilities capabilities = DesiredCapabilities.chrome(); capabilities.setCapability("chrome.switches", Arrays.asList("--proxy \"http=http://proxyserver:port/;https=http://proxyserver:port/\"")); WebDriver driver = new ChromeDriver(capabilities); 

现在你的来源问题是关于使用代理访问外部资源。 我们所做的(类似于您的问题)是为我们正在访问的网站传递代理例外,以便外部资源通过代理传递。

那么你为你的主网站添加一个例外 – 假设资源是10.1.10.5那么它看起来像:

 --proxy-bypass-list=10.1.10.5 

然后我们在代码中做:

 capabilities.setCapability("chrome.switches", Arrays.asList("--proxy=\"http=http://proxyserver:port/;https=http://proxyserver:port/\"" "--proxy-bypass-list=10.1.10.5")); 

请注意,设置用户名和密码是Chrome中的一个错误 。 (如果这能阻止你,请给它加星标。)

如果您需要用户名和密码,那么解决scheme就是一个PAC文件 。

语法是:

 --proxy-pac-url=file:///proxy.pac 

文件格式如下所示:

 if (host == "mylocalserver.com") { return 'DIRECT'; } else { return return "PROXY wcg2.example.com:8080 "; } 

对于代理设置中的用户名和密码的情况,请注意以下事项 :

代理自动configuration文件不支持硬编码的用户名和密码。 这背后也有很好的推理,因为提供对硬编码证书的支持会带来严重的安全漏洞,因为任何人都可以轻松查看所需的凭证来访问代理。

而是将代理configuration为透明代理,这样您就不需要用户名和密码。 您在其中一个评论中提到代理服务器位于LAN之外,这就是您需要validation的原因。 但是,大多数代理支持基于源IP的规则,在这种情况下,仅允许来自公司networking的请求是一个简单的问题。

最初的代理自动configuration规范最初是由Netscape在1996年起草的。最初的规范不再可以直接使用,但是仍然可以使用Wayback Machine的归档副本来访问它。 规范没有太大变化,与原来的基本相同。 你会看到规范很简单,而且没有规定硬编码的凭证。

要解决这个问题 – 你可以使用这个工具:

https://github.com/sjitech/proxy-login-automator

这个工具可以创build一个本地代理,并自动将用户/密码注入真实的代理服务器。 支持PAC脚本。