def _add_chrome_proxy_extension( chrome_options, proxy_string, proxy_user, proxy_pass): """ Implementation of https://stackoverflow.com/a/35293284 for https://stackoverflow.com/questions/12848327/ (Run Selenium on a proxy server that requires authentication.) """ arg_join = " ".join(sys.argv) if not ("-n" in sys.argv or "-n=" in arg_join or arg_join == "-c"): # Single-threaded proxy_helper.create_proxy_zip(proxy_string, proxy_user, proxy_pass) else: # Pytest multi-threaded test import threading lock = threading.Lock() with lock: time.sleep(random.uniform(0.02, 0.15)) if not os.path.exists(PROXY_ZIP_PATH): proxy_helper.create_proxy_zip( proxy_string, proxy_user, proxy_pass) time.sleep(random.uniform(0.1, 0.2)) proxy_zip = PROXY_ZIP_PATH if not os.path.exists(PROXY_ZIP_PATH): # Handle "Permission denied" on the default proxy.zip path proxy_zip = PROXY_ZIP_PATH_2 chrome_options.add_extension(proxy_zip) return chrome_options
def _add_chrome_proxy_extension( chrome_options, proxy_string, proxy_user, proxy_pass): """ Implementation of https://stackoverflow.com/a/35293284 for https://stackoverflow.com/questions/12848327/ (Run Selenium on a proxy server that requires authentication.) The retry_on_exception is only needed for multithreaded runs because proxy.zip is a common file shared between all tests in a single run. """ if not "".join(sys.argv) == "-c": # Single-threaded proxy_helper.create_proxy_zip(proxy_string, proxy_user, proxy_pass) else: # Pytest multi-threaded test lock = threading.Lock() with lock: if not os.path.exists(PROXY_ZIP_PATH): proxy_helper.create_proxy_zip( proxy_string, proxy_user, proxy_pass) time.sleep(0.3) chrome_options.add_extension(PROXY_ZIP_PATH) return chrome_options
def get_driver(browser_name, headless=False, use_grid=False, servername='localhost', port=4444, proxy_string=None): proxy_auth = False proxy_user = None proxy_pass = None if proxy_string: username_and_password = None if "@" in proxy_string: # Format => username:password@hostname:port try: username_and_password = proxy_string.split('@')[0] proxy_string = proxy_string.split('@')[1] proxy_user = username_and_password.split(':')[0] proxy_pass = username_and_password.split(':')[1] except Exception: raise Exception( 'The format for using a proxy server with authentication ' 'is: "username:password@hostname:port". If using a proxy ' 'server without auth, the format is: "hostname:port".') if browser_name != constants.Browser.GOOGLE_CHROME: raise Exception( "Chrome is required when using a proxy server that has " "authentication! (If using a proxy server without auth, " "either Chrome or Firefox may be used.)") proxy_string = validate_proxy_string(proxy_string) if proxy_string and proxy_user and proxy_pass: if not os.path.exists(PROXY_ZIP_PATH): proxy_helper.create_proxy_zip( proxy_string, proxy_user, proxy_pass) proxy_auth = True if use_grid: return get_remote_driver( browser_name, headless, servername, port, proxy_string, proxy_auth, proxy_user, proxy_pass) else: return get_local_driver( browser_name, headless, proxy_string, proxy_auth, proxy_user, proxy_pass)
def _add_chrome_proxy_extension( chrome_options, proxy_string, proxy_user, proxy_pass): """ Implementation of https://stackoverflow.com/a/35293284 for https://stackoverflow.com/questions/12848327/ (Run Selenium on a proxy server that requires authentication.) """ if not "".join(sys.argv) == "-c": # Single-threaded proxy_helper.create_proxy_zip(proxy_string, proxy_user, proxy_pass) else: # Pytest multi-threaded test lock = threading.Lock() with lock: time.sleep(random.uniform(0.02, 0.15)) if not os.path.exists(PROXY_ZIP_PATH): proxy_helper.create_proxy_zip( proxy_string, proxy_user, proxy_pass) time.sleep(random.uniform(0.1, 0.2)) proxy_zip = PROXY_ZIP_PATH if not os.path.exists(PROXY_ZIP_PATH): # Handle "Permission denied" on the default proxy.zip path proxy_zip = PROXY_ZIP_PATH_2 chrome_options.add_extension(proxy_zip) return chrome_options