使用selenium webdriver时,有没有办法动态更改Firefox使用的代理?
目前我有使用代理配置文件的代理支持但有没有办法在浏览器处于活动状态并运行时更改代理?
我目前的代码:
proxy = Proxy({
'proxyType': 'MANUAL',
'httpProxy': proxy_ip,
'ftpProxy': proxy_ip,
'sslProxy': proxy_ip,
'noProxy': '' # set this value as desired
})
browser = webdriver.Firefox(proxy=proxy)
提前致谢。
答案 0 :(得分:8)
这是一个稍微陈旧的问题。 但实际上可以通过" hacky方式动态更改代理 " 我将使用 Selenium JS与Firefox ,但您可以按照您想要的语言进行操作。
第1步:访问" about:config"
driver.get("about:config");
第2步:运行更改代理
的脚本var setupScript=`var prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
prefs.setIntPref("network.proxy.type", 1);
prefs.setCharPref("network.proxy.http", "${proxyUsed.host}");
prefs.setIntPref("network.proxy.http_port", "${proxyUsed.port}");
prefs.setCharPref("network.proxy.ssl", "${proxyUsed.host}");
prefs.setIntPref("network.proxy.ssl_port", "${proxyUsed.port}");
prefs.setCharPref("network.proxy.ftp", "${proxyUsed.host}");
prefs.setIntPref("network.proxy.ftp_port", "${proxyUsed.port}");
`;
//running script below
driver.executeScript(setupScript);
//sleep for 1 sec
driver.sleep(1000);
使用 $ {abcd} 是放置变量的地方,在上面的示例中我使用的是处理串联的ES6,如图所示,您可以使用您选择的其他串联方法,具体取决于您的语言。
第3步::访问您的网站
driver.get("http://whatismyip.com");
说明:上面的代码利用Firefox的API来改变使用JavaScript代码的首选项。
答案 1 :(得分:3)
据我所知,只有两种方法可以更改代理设置,一种是通过配置文件(您正在使用),另一种是使用驱动程序的功能按here进行实例化。可悲的是,这些方法都没有做到你想要的,因为它们都是在你创建驱动程序之前发生的。
我不得不问,为什么要更改代理设置?我能想到的唯一解决方案是将firefox指向可以在运行时更改的代理。我不确定,但浏览器代理可以实现这一点。
答案 2 :(得分:1)
一种可能的解决方案是关闭webdriver实例并在每次操作后通过在浏览器配置文件中传递新配置再次创建它
答案 3 :(得分:0)
尝试selenium-wire,它甚至可以覆盖标头字段
from seleniumwire import webdriver
options = {
'proxy': {
"http": "http://" + IP_PORT,
"https": "http://" + IP_PORT,
'custom_authorization':AUTH
},
'connection_keep_alive': True,
'connection_timeout': 30,
'verify_ssl': False
}
# Create a new instance of the Firefox driver
driver = webdriver.Firefox(seleniumwire_options=options)
driver.header_overrides = {
'Proxy-Authorization': AUTH
}
# Go to the Google home page
driver.get("http://whatismyip.com")
driver.close()