我正在使用Docker Selenium图像来运行浏览器节点,这里可以使用repo https://github.com/SeleniumHQ/docker-selenium。没有关于config.json如何用于提供代理值的文档。
我使用的是Selenium 2.44.0版。
在我的基础架构中,某些资源来自某个位置,需要在浏览器上进行代理配置才能访问它们。我正在尝试在chrome节点上设置代理。根据此documentation here,代理可以设置如下:
java -jar selenium-2.44.0.jar -Dhttp.proxyHost=192.168.2.10 -Dhttp.proxyPort=80
我的代理不需要,使用名称和密码,因此我忽略了这些值。 SeleniumHQ文档中没有明确提到的是,它是需要在集线器或节点上还是仅在节点上进行代理配置。我尝试了不同的组合,但没有为我工作。
我正在运行的实际命令是:
对于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 *值显示在控制台配置上。
对于节点:
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
当我运行此命令时,我可以再次在控制台上看到代理值,但我没有浏览器加载资源。
另外,从侧面说明看起来这可以在开发者方面(in java code)完成,但我很想在我的(操作)方面解决它。
答案 0 :(得分:1)
谢谢 - 这是我们得到的:
首先,您需要一种方法来验证您的settings made it into the browser。
chrome://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"));
请注意,设置用户名和密码为a bug in Chrome。 (如果这让你感到高兴,请把它加星标。)
如果您需要用户名和密码,则解决方案为a PAC file。
语法为:
--proxy-pac-url=file:///proxy.pac
文件格式如下:
if (host == "mylocalserver.com")
{
return 'DIRECT';
} else {
return return "PROXY wcg2.example.com:8080 ";
}
对于代理设置中的用户名和密码,请注意the following:
代理自动配置文件不支持硬编码的用户名和密码。这背后还有很好的理由,因为提供对硬编码凭证的支持会打开重大的安全漏洞,因为任何人都可以轻松查看访问代理所需的凭据。
而是将代理配置为透明代理,这样您就不需要用户名和密码。您在其中一条评论中提到代理服务器位于LAN之外,这就是您需要身份验证的原因。但是,大多数代理支持基于源IP的规则,在这种情况下,它只是允许来自公司网络的请求。
最初的代理自动配置规范最初由Netscape于1996年起草。原始规范不再直接提供,但您仍然可以使用The Wayback Machine的archived copy访问它。规范没有太大变化,并且仍然与原来大致相同。您将看到规范非常简单,并且没有提供硬编码凭据。
要解决此问题 - 您可以使用此工具:
https://github.com/sjitech/proxy-login-automator
此工具可以创建本地代理并自动将用户/密码注入真实代理服务器。支持PAC脚本。