Как переопределить базовую аутентификацию в selenium2 с Java, используя драйвер chrome? - PullRequest
8 голосов
/ 27 марта 2012

Как переопределить базовую аутентификацию в драйвере селена2 хром? Я столкнулся с проблемой в моем проекте, когда появляется всплывающее окно chrome "Требуется аутентификация", которое блокирует веб-драйвер для продолжения навигации. Пожалуйста, найдите прикрепленный скриншот для того же. enter image description here Я использую следующий код для создания экземпляра драйвера 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();
}

Не могли бы вы помочь -

Спасибо

Ответы [ 5 ]

7 голосов
/ 09 февраля 2016

Я боролся с той же проблемой в течение часа, и, наконец, решение @ kenorb спасло меня.Короче говоря, вам нужно добавить расширение для браузера, которое выполняет аутентификацию за вас (поскольку сама Selenium не может этого сделать!).

Вот как это работает для Chrome и Python :

  1. Создать 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']
);

Не забудьте заменить YOUR_PROXY _ * на ваши настройки.

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"
}

Добавить созданный 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, перейдите к оригинальному сообщению

4 голосов
/ 20 января 2015

Я думаю, вы говорите об использовании аутентификации NTLM ( встроенная проверка подлинности Windows ), а не Базовая аутентификация (, когда вы предоставляете свои учетные данные в URL-адресе).Предполагая, что вот что вы можете попробовать для запуска аутентификации NTML в chrome:

Подход 1

Перейдите в Internet Explorer и откройте «Свойства обозревателя».Выполните следующие действия:

  • Добавьте свой сайт в локальную интрасеть или на доверенные сайты add
  • List item
  • List item
  • List item
  • List item

После этих изменений ваша хром-аутентификация должна работать.Если вам интересно, как настройки IE влияют на поведение Chrome, тогда Chrome использует настройки безопасности IE для аутентификации.

Некоторые полезные ресурсы / кредиты:

  1. Хорошая информация
  2. Сведения о выпуске Selenium

Подход 2

Добавьте ваш сайт в Локальная интрасеть и не меняйтечто-нибудь для аутентификации пользователя.По умолчанию выбран второй вариант ( Автоматический вход только на сайтах интрасети ).

2 голосов
/ 28 марта 2012

Вы можете попробовать добавить учетные данные для входа в запрос на получение URL (на Java):

driver.get("http://username:password@google.com/")
0 голосов
/ 15 августа 2016

Мне удается сделать это, отправив учетные данные дважды. Я не знаю почему, но во второй раз, когда браузер отправляет пакет, заголовок аутентификации идет с базовой аутентификацией.

Мой код (с использованием C #):

string url = "http://user:password@google.com/";
IWebDriver webDriver = new ChromeDriver();
webDriver.Navigate().GoToUrl(url);
webDriver.Url = url;
0 голосов
/ 04 мая 2015

Помимо настройки Настройки сетевого прокси , вы можете установить 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 .

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...