Как переопределить базовую аутентификацию в selenium2 с помощью Java с помощью драйвера Chrome?

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

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

Спасибо,


person ABCDEFG    schedule 27.03.2012    source источник
comment
это говорит о структуре HTMLUnit, и я попытался реализовать то же самое в своем проекте. но код не сработал, почему это не код веб-драйвера Selenium. Пожалуйста, помогите с кодом Selenium WebDriver. Благодарность-   -  person ABCDEFG    schedule 28.03.2012


Ответы (5)


Я боролся с той же проблемой более часа, и, наконец, решение @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"
}
  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, перейдите к исходному сообщению

person Mike    schedule 09.02.2016
comment
Как насчет Явы? Как я могу сделать это с помощью java? - person Ripon Al Wasim; 11.03.2016
comment
Привет, Майк, я пытался заставить твой пример работать, но это не удалось. Не могли бы вы взглянуть на мой вопрос? У меня есть пример на Github stackoverflow.com/questions/44458165/ - person ; 12.06.2017
comment
Я не мог заставить это работать, но кто-то опубликовал ответ в stackoverflow.com/questions/44458165/, которое сделало - person ; 14.06.2017
comment
Майк, у меня не получилось с этим журналом: joxi.net/LmG3OVNTRbEMam Последние строки: WebDriverException: Message: unknown error: cannot process extension #1 from unknown error: cannot read manifest (Driver info: chromedriver=2.29.461591 (62ebf098771772160f391d75e589dc567915b233),platform=Windows NT 10.0.14393 x86_64) Есть совет? - person Igor Savinkin; 03.10.2017

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

Подход 1

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

  • Добавьте свой сайт либо в локальную интрасеть, либо в надежные сайты add
  • Элемент списка
  • Элемент списка
  • Элемент списка
  • Элемент списка

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

Некоторые хорошие ресурсы / кредиты:

  1. Подробности
  2. сведения о проблеме с Selenium

Подход 2

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

person Rohit    schedule 20.01.2015
comment
Вопрос про гугл хром. Но вы дали ответ, связанный с IE. - person Ripon Al Wasim; 11.03.2016
comment
Да, потому что, когда я отвечал на этот вопрос, Chrome использовал информацию о безопасности из IE. Сегодня не проверял актуальность. - person Rohit; 11.03.2016
comment
Подход 1 хорошо работал с Chrome 55.0.2883.87 m (64-разрядная версия), подход 2 не пробовал. - person Lauri Harpf; 13.01.2017

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

driver.get("http://username:[email protected]/")
person kenki    schedule 28.03.2012
comment
Как вы заметили, базовая аутентификация не очень хорошо поддерживается в Selenium. На странице проекта есть запрос функции, а также несколько комментариев и обходных путей. Вы можете проверить это здесь - person kenki; 29.03.2012
comment
У меня работает с Selenium WebDriver - person dirkoneill; 08.10.2013
comment
Я написал свой код, как указано выше. Но, к сожалению, это не работает. - person Ripon Al Wasim; 11.03.2016

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

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

string url = "http://user:[email protected]/";
IWebDriver webDriver = new ChromeDriver();
webDriver.Navigate().GoToUrl(url);
webDriver.Url = url;
person Thiago    schedule 15.08.2016
comment
Это нонсенс - person Elmue; 17.05.2017

Помимо настройки настроек сетевого прокси, вы можете установить http_proxy в /etc/environment.

Другой метод — использовать частный HTTP-прокси Chrome (который основан на 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.

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

person kenorb    schedule 04.05.2015