12

目前这是我的代码,但是 webDriver 显示一个弹出窗口以输入代理凭据,我不希望出现这种烦人的情况,这不是第一次在 stackoverflow 中出现相同的问题,但没有人回答正确的答案.

我试图谷歌找到这个问题的解决方案。我开始知道java中的解决方案,但我不知道我们如何在python中做到这一点。

    PROXY_HOST = "65.49.1.59"
    PROXY_PORT = 60099
    fp = webdriver.FirefoxProfile()
    # Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5

    print " im in parse_details"

    fp.set_preference("network.proxy.type", 1)
    fp.set_preference('network.http.phishy-userpass-length', 255)

    fp.set_preference("network.proxy.http", PROXY_HOST)
    fp.set_preference("network.proxy.http_port", PROXY_PORT)
    fp.set_preference("network.proxy.ftp", PROXY_HOST)
    fp.set_preference("network.proxy.ftp_port", PROXY_PORT)
    fp.set_preference("network.proxy.ssl", PROXY_HOST)
    fp.set_preference("network.proxy.ssl_port", PROXY_PORT)
    #fp.set_preference("network.proxy.user_name", 'someusername')
    #fp.set_preference("network.proxy.password", 'somepassword')
    fp.set_preference("network.proxy.no_proxies_on", "") # set this value as desired

    self.driver = webdriver.Firefox(firefox_profile=fp)
    self.driver.get("http://www.whatismyip.com/")

以下这些陈述是我猜到的,我不确定它们的语法是否正确,即使我试图在 selenium 文档中找出,但没有帮助。你们能否对此有所了解。

    #fp.set_preference("network.proxy.user_name", 'someusername')
    #fp.set_preference("network.proxy.password", 'somepassword')

ps 这里问的同样的问题Selenium using Python: enter/provide http proxy password for firefox

4

3 回答 3

12

Selenium 无法处理基本身份验证,也不能很好地处理弹出窗口。但是这个问题是可以解决的。作为对我有用的解决方案(我在这里找到了)是添加一个浏览器扩展来对 Selenium 进行身份验证。这很简单。以下是它在 Chrome 和 Python 上的工作方式:

  1. 创建一个包含两个文件的 zip 文件proxy.zip :

背景.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']
);

不要忘记将YOUR_PROXY_*替换为您的设置。

清单.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. 将创建的 proxy.zip 添加为扩展

蟒蛇代码:

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

而已。对我来说,这就像一个魅力。如果您需要动态创建 proxy.zip 或需要 PHP 示例,请转到原始帖子

于 2016-02-09T13:25:56.793 回答
3

我知道它很晚才回答你的问题,但最近我开始使用 Python,并试图做同样的事情并做了类似的事情来处理这种情况。

在代理服务器后面运行 selenium web 驱动程序

  1. 需要创建一个 firefox 配置文件,其中应该安装“autoauth”插件。
  2. 尝试通过手动点击 URL 来保存代理服务器用户名和密码。
  3. Firefox 配置文件将在 autoauth 的帮助下保存代理服务器的凭据
  4. 在脚本中调用该特定的 Firefox 配置文件。
  5. 设置所有首选项以定义代理服务器详细信息。
  6. 将 Firefox 配置文件分配给浏览器的实例
  7. 点击任意网址,下面是运行示例

PS:从互联网选项中删除所有代理设置,脚本将自动使用它

因此,从技术上讲,您不会发送代理用户名和密码,而是将这些凭据保存在 firefox 中并调用该特定的 firefox 配置文件。

希望您早就解决了您的问题,但如果它仍然存在,这可能会对您有所帮助。:)

于 2013-05-08T09:26:10.480 回答
0

有关如何访问 firefox 配置文件的信息,请参阅此路径:http: //software-testing-tutorials-automation.blogspot.jp/2014/05/how-to-create-and-use-custom-firefox.html

基本上,您需要创建一个配置文件并在 Firefox 中使用该配置文件。现在,当您通过 selenium 运行时,您的配置文件的行为也将是相同的。因此,如果您的配置文件会提示代理身份验证,那么它也会在您通过 selenium 打开它时显示。因此,您必须找到一种方法,使用附加组件来隐藏使用该配置文件的身份验证。成功完成之后,Selenium 也一样。

于 2015-09-11T03:28:41.480 回答