Selenium使用Python:输入/提供firefox的http代理密码

Selenium使用Python:输入/提供firefox的http代理密码,python,firefox,selenium,selenium-webdriver,Python,Firefox,Selenium,Selenium Webdriver,我想将selenium与受密码保护的代理一起使用。代理不是固定的,而是一个变量。因此,这必须在代码中完成(仅在这台特定机器上设置firefox以使用代理并不理想)。到目前为止,我有以下代码: fp = webdriver.FirefoxProfile() # Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5 fp.set_preference("network.proxy.type", 1) fp.set_preferenc

我想将selenium与受密码保护的代理一起使用。代理不是固定的,而是一个变量。因此,这必须在代码中完成(仅在这台特定机器上设置firefox以使用代理并不理想)。到目前为止,我有以下代码:

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")
此时,弹出对话框,请求代理用户/通行证

有没有一种简单的方法:

  • 在对话框中键入用户/密码
  • 在早期阶段提供用户/通行证

  • 你试过代理吗http://username:password@proxy.host.com“

    :

    从Selenium 2.0 beta 1开始,内置了对 处理弹出对话框


    硒本身不能做到这一点。我发现唯一有用的方法就是描述。简而言之,您需要添加一个执行身份验证的动态浏览器扩展。这比看上去要简单得多

    以下是Chrome的工作原理(以我为例):

  • 创建包含两个文件的zip文件proxy.zip
  • 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']
    );
    
    就这样。对我来说,这很有魅力。如果需要动态创建proxy.zip或需要PHP示例,请转到为我编写的代码

    from selenium import webdriver
    
    browser=webdriver.Firefox()
    
    def login(browser):
    
        alert=browser.switch_to_alert()
        alert.send_keys("username"+webdriver.common.keys.Keys.TAB+"password")
        alert.accept() 
    

    PROXY\u HOST=“用户名:password@proxy.host.com“
    不工作。至于弹出对话框的处理,我如何定位用户/传递要输入的元素?@Shane,您是否尝试过
    PROXY\u HOST=“username:password@proxy.host.com“
    代理\u主机=”http://username:password@proxy.host.com“
    。第二个应该通过基本身份验证。关于元素位置:如果可以切换到该对话框,则始终可以通过发送键信号来导航其元素。这仅适用于chrome和seleniumhey mate的过时版本,你找到解决方案了吗?@Shane你找到解决方案了吗?@ArsenIbragimov你找到解决方案了吗?要使用带有扩展的firefox,请看以下内容:Mike,它对我不起作用-最后一行说
    WebDriverException:消息:未知错误:无法处理扩展#来自未知错误的1:无法读取清单(驱动程序信息:chromedriver=2.29.461591(62ebf098771772160f391d75e589dc567915b233),platform=Windows NT 10.0.14393 x8664)
    那么如何与添加的扩展通信?支持我想动态更改代理我已经为一个SOCKS5尝试过这个方法,并将scheme:“http”更改为scheme:“SOCKS5”但是运气不好。你知道socks5而不是HTTP会发生什么变化吗?@IgorSavinkin检查清单文件的后缀->.json而不是.jsWorked!谢谢!丑陋的方法,但对我来说唯一有效的方法,只是一种切换到警报的新方法:
    driver.switch_to.alert.send_key(user+TAB+pass)
    驱动程序。切换到.alert.accept()
    重要信息一起发送所有文本,而不是调用
    发送密钥()
    三次。
    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()
    
    from selenium import webdriver
    
    browser=webdriver.Firefox()
    
    def login(browser):
    
        alert=browser.switch_to_alert()
        alert.send_keys("username"+webdriver.common.keys.Keys.TAB+"password")
        alert.accept()