Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selenium using Python: enter/provide http proxy password for firefox

Tags:

I want to use selenium with a proxy which is password protected. The proxy is not fixed, but a variable. So this has to be done in the code (just setting up firefox on this particular machine to work with the proxy is less-than-ideal). So far I have the following code:

fp = webdriver.FirefoxProfile() # Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5 fp.set_preference("network.proxy.type", 1)  fp.set_preference("network.proxy.http", PROXY_HOST) fp.set_preference("network.proxy.http_port", PROXY_PORT)  driver = webdriver.Firefox(firefox_profile=fp) driver.get("http://whatismyip.com") 

At this point, the dialog pops up requesting the proxy user/pass.

Is there an easy way to either:

  1. Type in the user/pass in the dialog box.
  2. Provide the user/pass at an earlier stage.
like image 613
Claudiu Avatar asked Jan 16 '12 19:01

Claudiu


1 Answers

Selenium can't do that by itself. The only way I found helpful is described here. To be short, you need to add a browser extension on fly that does the authentication. It's much simpler than may seem to be.

Here is how it works for Chrome (in my case):

  1. Create a zip file proxy.zip containing two files:

background.js

var config = {     mode: "fixed_servers",     rules: {       singleProxy: {         scheme: "http",         host: "YOU_PROXY_ADDRESS",         port: parseInt(YOUR_PROXY_PORT)       },       bypassList: ["foobar.com"]     }   };  chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});  function callbackFn(details) {     return {         authCredentials: {             username: "YOUR_PROXY_USERNAME",             password: "YOUR_PROXY_PASSWORD"         }     }; }  chrome.webRequest.onAuthRequired.addListener(         callbackFn,         {urls: ["<all_urls>"]},         ['blocking'] ); 

Don't forget to replace YOUR_PROXY_* to your settings.

manifest.json

{     "version": "1.0.0",     "manifest_version": 2,     "name": "Chrome Proxy",     "permissions": [         "proxy",         "tabs",         "unlimitedStorage",         "storage",         "<all_urls>",         "webRequest",         "webRequestBlocking"     ],     "background": {         "scripts": ["background.js"]     },     "minimum_chrome_version":"22.0.0" } 
  1. Add the created proxy.zip as an extension

    from selenium import webdriver from selenium.webdriver.chrome.options import Options  chrome_options = Options() chrome_options.add_extension("proxy.zip")  driver = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options) driver.get("http://google.com") driver.close() 

That's it. For me that worked like a charm. If you need to create proxy.zip dynamically or need PHP example then go to the original post

like image 156
Mike Avatar answered Oct 13 '22 02:10

Mike