Python Selenium Webdriver - change proxy settings on the fly

I am currently successfully using the code below to use a proxy with a Selenium web server. Unfortunately, I cannot get the proxy settings to change without restarting the whole browser. I was hoping that just updating the proxy settings like I did to set the proxy would change the proxy, but it doesn't seem to work. Any help on this would be greatly appreciated.

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)

      

+7


source to share


2 answers


This is a bit old question. But it is actually possible to dynamically change proxies through the " hacky way " I'm going to use Selenium JS with Firefox, but you can follow it in the language you want.

Step 1: Visit "about: config"

driver.get("about:config");

      

Step 2: Run a script that will change the proxy

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);

      



Where $ {abcd} is used where you put your variables, in the above example I am using ES6 which handles concatenation as shown, you can use other concatenation methods of your choice, depending on your ( SetupScript ) is a string containing script to run in ``)

Step 3: . Visit your site.

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

      

Explanation: The code above uses the Firefox API to change settings using JavaScript code.

+5


source


To set up proxies on the fly with 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"})

      



Using:

 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://....")

      

+1


source







All Articles