9

如何覆盖 selenium2 chrome 驱动程序中的基本身份验证?我在我的项目中遇到了一个问题,其中 chrome “需要身份验证”弹出窗口正在阻止 webdriver 继续导航。请找到所附的屏幕截图。 在此处输入图像描述 我正在使用以下代码来实例化 chrome 驱动程序,

private WebDriver driver;
@Override
protected void setUp() throws Exception {
    super.setUp();
    System.setProperty("webdriver.chrome.driver", "C:/Selenium/chromedriver.exe");
    driver = new ChromeDriver();
}
@Override
protected void tearDown() throws Exception {
    // TODO Auto-generated method stub
    super.tearDown();
}

能否请你帮忙 -

谢谢,

4

5 回答 5

7

我在同一个问题上苦苦挣扎了一个多小时,最后@kenorb 的解决方案救了我。简而言之,您需要添加一个为您进行身份验证的浏览器扩展程序(因为 Selenium 本身不能这样做!)。

以下是它在ChromePython上的工作方式:

  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:13:53.273 回答
4

我认为您正在谈论使用NTLM 身份验证Windows 集成身份验证)而不是基本身份验证您在 URL 中提供您的凭据)。假设这是您可以尝试在 chrome 中运行 NTML auth 的方法:

方法一

转到 Internet Explorer,然后打开“Internet 选项”。请按照以下步骤操作:

  • 将您的站点添加到本地 Intranet 或受信任站点添加
  • 项目清单
  • 项目清单
  • 项目清单
  • 项目清单

在这些更改之后,您的 chrome 身份验证应该可以工作。如果您想知道 IE 设置如何影响 Chrome 的行为,Chrome 使用 IE 安全设​​置进行身份验证。

一些好的资源/学分:

  1. 好细节
  2. 硒问题详细信息

方法二

将您的站点添加到本地 Intranet,并且不要更改任何用户身份验证。默认情况下,选择第二个选项(仅在 Intranet 站点中自动登录)。

于 2015-01-20T14:45:03.227 回答
2

您可以尝试将登录凭据添加到 url 获取请求(在 Java 中):

driver.get("http://username:password@google.com/")
于 2012-03-28T19:18:08.857 回答
0

我设法做到了两次发送凭据。我不知道为什么,但是在浏览器第二次发送数据包时,身份验证标头与基本身份验证一起使用。

我的代码(使用 C#):

string url = "http://user:password@google.com/";
IWebDriver webDriver = new ChromeDriver();
webDriver.Navigate().GoToUrl(url);
webDriver.Url = url;
于 2016-08-15T20:53:18.170 回答
-1

除了配置网络代理首选项外,您还可以http_proxy/etc/environment.

其他方法是使用Chrome HTTP Private Proxy(基于Chrome-proxy-helper)。

这是 PHP 示例(在 README 中找到):

$pluginForProxyLogin = '/tmp/a'.uniqid().'.zip';

$zip = new ZipArchive();
$res = $zip->open($pluginForProxyLogin, ZipArchive::CREATE | ZipArchive::OVERWRITE);
$zip->addFile('/path/to/Chrome-proxy-helper/manifest.json', 'manifest.json');
$background = file_get_contents('/path/to/Chrome-proxy-helper/background.js');
$background = str_replace(['%proxy_host', '%proxy_port', '%username', '%password'], ['5.39.64.181', '54991', 'd1g1m00d', '13de02d0e0z9'], $background);
$zip->addFromString('background.js', $background);
$zip->close();

putenv("webdriver.chrome.driver=/path/to/chromedriver");

$options = new ChromeOptions();
$options->addExtensions([$pluginForProxyLogin]);
$caps = DesiredCapabilities::chrome();
$caps->setCapability(ChromeOptions::CAPABILITY, $options);

$driver = ChromeDriver::start($caps);
$driver->get('https://old-linux.com/ip/');

header('Content-Type: image/png');
echo $driver->takeScreenshot();


unlink($pluginForProxyLogin);

同样的逻辑也适用于其他语言。

SeleniumHQ GitHub 上已经报告了更便携的解决方案。

也可以看看:

于 2015-05-04T20:11:31.463 回答