Daniel Pilch
Daniel Pilch

Reputation: 2247

Dynamically changing proxy in Firefox with Selenium webdriver

Is there any way to dynamically change the proxy being used by Firefox when using selenium webdriver?

Currently I have proxy support using a proxy profile but is there a way to change the proxy when the browser is alive and running?

My current code:

proxy = Proxy({
    'proxyType': 'MANUAL',
    'httpProxy': proxy_ip,
    'ftpProxy': proxy_ip,
    'sslProxy': proxy_ip,
    'noProxy': '' # set this value as desired
    })
browser = webdriver.Firefox(proxy=proxy)

Thanks in advance.

Upvotes: 11

Views: 8192

Answers (4)

Jerry An
Jerry An

Reputation: 1432

Have a try selenium-wire, It can even override header field

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

Upvotes: 0

Paul Harris
Paul Harris

Reputation: 5809

As far as I know there are only two ways to change the proxy setting, one via a profile (which you are using) and the other using the capabilities of a driver when you instantiate it as per here. Sadly neither of these methods do what you want as they both happen before as you create your driver.

I have to ask, why is it you want to change your proxy settings? The only solution I can easily think of is to point firefox to a proxy that you can change at runtime. I am not sure but that might be possible with browsermob-proxy.

Upvotes: 3

Bob Kimani
Bob Kimani

Reputation: 1164

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

Step 1: Visiting "about:config"

driver.get("about:config");

Step 2 : Run script that changes 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 use ${abcd} is 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 language.

Step 3: : Visit your site

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

Explanation:the above code takes advantage of Firefox's API to change the preferences using JavaScript code.

Upvotes: 14

SEDaradji
SEDaradji

Reputation: 1441

One possible solution is to close the webdriver instance and create it again after each operation by passing a new configuration in the browser profile

Upvotes: 1

Related Questions