Python Selenium Webdriver-动态更改代理设置

Python Selenium Webdriver-动态更改代理设置,python,python-3.x,selenium,proxy,webdriver,Python,Python 3.x,Selenium,Proxy,Webdriver,我目前正在成功地使用下面的代码将代理与Selenium webdriver一起使用。不幸的是,我似乎无法让它在不重新启动整个浏览器的情况下更改代理设置。我曾希望简单地更新代理设置,就像我在开始设置代理时所做的那样,可以更改代理,但它似乎不起作用。在此问题上的任何帮助都将不胜感激 profile = webdriver.FirefoxProfile() profile.set_preference("network.proxy.type", 1) profile.set_preference("n

我目前正在成功地使用下面的代码将代理与Selenium webdriver一起使用。不幸的是,我似乎无法让它在不重新启动整个浏览器的情况下更改代理设置。我曾希望简单地更新代理设置,就像我在开始设置代理时所做的那样,可以更改代理,但它似乎不起作用。在此问题上的任何帮助都将不胜感激

profile = webdriver.FirefoxProfile()
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.http", proxyAddress)
profile.set_preference("network.proxy.http_port", proxyPort)
profile.update_preferences()
driver = webdriver.Firefox(firefox_profile=profile)

这是一个有点老的问题。 但实际上,可以通过“黑客方式”动态更改代理 我将在Firefox中使用Selenium JS,但您可以使用您想要的语言

步骤1:访问“关于:配置”

步骤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);
其中use${abcd}是放置变量的地方,在上面的示例中,我使用ES6处理连接,如图所示,您可以使用您选择的其他连接方法,具体取决于您的语言。SetupScript是一个字符串,其中包含要运行的脚本,并用``括起来)

第3步::访问您的网站

driver.get("https://whatismyip.com");

说明:以上代码利用Firefox的API使用JavaScript代码更改首选项。

要使用Firefox动态设置代理,请执行以下操作:

def set_proxy(driver, http_addr='', http_port=0, ssl_addr='', ssl_port=0, socks_addr='', socks_port=0):

    driver.execute("SET_CONTEXT", {"context": "chrome"})

    try:
        driver.execute_script("""
          Services.prefs.setIntPref('network.proxy.type', 1);
          Services.prefs.setCharPref("network.proxy.http", arguments[0]);
          Services.prefs.setIntPref("network.proxy.http_port", arguments[1]);
          Services.prefs.setCharPref("network.proxy.ssl", arguments[2]);
          Services.prefs.setIntPref("network.proxy.ssl_port", arguments[3]);
          Services.prefs.setCharPref('network.proxy.socks', arguments[4]);
          Services.prefs.setIntPref('network.proxy.socks_port', arguments[5]);
          """, http_addr, http_port, ssl_addr, ssl_port, socks_addr, socks_port)

    finally:
        driver.execute("SET_CONTEXT", {"context": "content"})
用法:

 driver = webdriver.Firefox()

 set_proxy(driver, http_addr="212.35.56.21", http_port=8080)

 driver.get("http://....")

 set_proxy(driver, http_addr="212.35.56.22", http_port=8888)

 driver.get("http://....")

要使用Chrome动态更改代理(使用selenium 3.141.0,关键点是
驱动程序。启动会话(cap)
):

proxy=get_new_proxy()#x.x.x.x:y
c={
“proxyType”:“手动”,
“httpProxy”:代理,
“sslProxy”:代理
}
cap=webdriver.DesiredCapabilities.CHROME.copy()
cap['proxy']=c
驱动程序启动会话(cap)
尝试:
b、 得到('https://whatismyip.com')
例外情况除外,如e:
打印(e)

p、 指定代理时也可以使用s.
selenium.webdriver.common.proxy.proxy
add_to_capabilities()

创建链接到代理的本地代理。必要时,请您的本地代理更改“退出”。这似乎太复杂了。我希望有一种更简单的方法可以做到这一点。实际上,这听起来像是10行代码,有一个python库可以处理任何事情。你有没有找到解决方案?还是像@user37203所描述的那样解决问题的python库?只是问一下,在我自己实现之前…@stylesuxx-Nope。我从来没有找到过这样的库,我放弃了这个项目,所以我从来没有自己动手解决这个问题。我承认我还没有测试过这个解决方案,而且这个项目很久以前就被放弃了,但我还是会接受答案的。谢谢我已经测试过这个解决方案,它的效果非常好。你能提供一个python版本吗?谢谢你能提供一个chrome版本吗??请原谅我问了个愚蠢的问题,但是你在哪里运行这个脚本?你是如何运作的?您可以在其中使用变量,还是需要为每个代理创建一个脚本?我想在Java中使用它,如果这有什么不同的话。我正在尝试使用你的解决方案,但我一直得到
keyrerror:“SET\u CONTEXT”
,我不知道我做错了什么。甚至找不到这些函数的文档。非常感谢您的帮助。谢谢暂时进入chrome上下文的一个更简单的方法是使用driver.context(driver.context\u chrome):它与Google chrome一起工作吗?
 driver = webdriver.Firefox()

 set_proxy(driver, http_addr="212.35.56.21", http_port=8080)

 driver.get("http://....")

 set_proxy(driver, http_addr="212.35.56.22", http_port=8888)

 driver.get("http://....")