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

时间:2015-03-08 23:56:20

标签: selenium proxy docker

我正在使用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)完成,但我很想在我的(操作)方面解决它。

1 个答案:

答案 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脚本。