Как можно передать логин/пароль браузеру Chrome при запуске?

Привет всем, ситуация такая: у нас есть корпоративный сайт1 с NTLM-авторизацией (учётку берет из Windows-овского хранилища учёток). С тестовой Windows-тачки данный сайт1 открывается норм.

Также есть образ Selenoid_UI с браузером Chrome. И вот если тут в Selenoid пытаюсь открыть данный сайт1, то возникает окошко авторизации, которым webdriver управлять не может. Выглядит так:

Тут еще зависит от сайта. Есть например другой сайт2, у него аналогичное окно. Но для него мы просто посылаем “нажатие клавиши Esc”, и окно закрывается, и появляется обычная форма авторизации, которую можно заполнить методами webdriver-а.

Но для данного сайта1 так нельзя. Если ему послать “нажатие клавиши Esc”, то это окно закроется, и отобразится ошибка 401.

Кто-нибудь сталкивался с такой проблемой? Можете подсказать, как можно передать логин/пароль браузеру Chrome при старте? Возможно, тут либо некую капабилити надо использовать, или опцию командной строки.

Вроде как, никак.
Самое простое - использовать робота java.awt.Robot

1 лайк

меня несколько человек пытались убедить, что можно просто в урле передавать логин и пароль от виндовой учётки, и якобы это позволяет проходить аутентификацию от имени соответствующих AD-учёток

по итогу пришлось писать свой велосипед по, как это хорошо называется, имперсонации

2 лайка

Обязательно заполнять именно через браузер?
Если нет - логиньтесь через api, затем в браузер подбрасывайте соответствующую куку или хидер, в зависимости от того, как оно у вас имплементировано.

1 лайк

не берусь говорить как именно сделано у вопрошающего, но там, где я решал подобную проблему, сама по себе аутентификация другая. Не логин-пароль и хранение куки в session storage браузера, а виндовая проверка, что процесс браузера запущен от нужной учетной записи
после подобной аутентификации и выяснения, от какой ad-учетки браузер запущен, проверялись права в бд и происходил вход

1 лайк

Можно в URL передавать логин и пароль, вот так http://user:password@domain.com/.
У меня работает.

1 лайк

Привет ещё раз. Перепробовал разные способы, ничего не помогло. Довольно специфичный у нас проект :frowning_face:.

В итоге удалось нагуглить подходящий мне способ. Напишу, вдруг кому-то ещё пригодится. В общем, всплывающее окно аутентификации можно побороть с помощью расширения для браузера. Сделал в итоге простейшее расширение.

(1) Создаём папку, например extension. В ней 2 файла manifest.json и webrequest.js.

(2) Содержимое manifest.json такое:

{
  "manifest_version": 2,

  "name": "Webrequest API",
  "version": "1.0",
  "description": "Extension to handle Authentication window",

  "permissions": [
    "webRequest",
    "webRequestBlocking",

    "https://*.mysite1.com/*",
    "https://*.mysite2.com/*"
  ],

  "background": {
    "scripts": [
      "webrequest.js"
    ]
  }
}

Содержимое webrequest.js такое:

console.log("Hello World version 1.0");

// add event listener
chrome.webRequest.onAuthRequired.addListener(
    function (details) {
        console.log("onAuthRequired event has fired", details);
        return {
            authCredentials: {
                username: "user1",
                password: "pswd1"
            }
        };
    },

    {
        urls: [
            "https://*.mysite1.com/*",
            "https://*.mysite2.com/*"
        ]
    },

    [
        "blocking"
    ]
);

Версия манифеста всегда 2, а параметры name, version, description прописываем сами. В разделах permissions и urls должны присутствовать шаблоны url-ов для наших сайтов. В разделе authCredentials указываем нужный логин/пароль.

(3) Затем в браузере Chrome пишем chrome://extensions. Заходим в расширения. Включаем Developer mode. Далее Pack extension, и указываем нашу папку extension.

В итоге Chrome создаст нам 2 файла:

  • extension.crx
  • extension.pem

В java-проекте в папке resources создаём директорию chrome_extensions и копируем туда файл extension.crx.

(4) В коде автотеста добавляем наше расширение:

    final ChromeOptions options = new ChromeOptions();
    final ClassLoader classLoader = ChromeDriverFactory.class.getClassLoader();
    final String fileString = classLoader.getResource("chrome_extensions/extension.crx").getFile();
    final File extensionFile = new File(fileString);
    log.trace("fileString: '" + fileString + "'");
    log.trace("extension file path: '" + extensionFile.getAbsolutePath() + "'");
    log.trace("extension file name: '" + extensionFile.getName() + "'");
    options.addExtensions(extensionFile);
    options.addArguments("--no-sandbox");
    options.addArguments("--auth-server-whitelist=*.site.com");

    DesiredCapabilities caps = new DesiredCapabilities();
    caps.setBrowserName("chrome");
    caps.setCapability("enableVNC", true);
    // выставляю много разных капабилити
    caps.setCapability(CapabilityType.PROXY, proxy);
    caps.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);
    caps.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
    caps.setCapability(ChromeOptions.CAPABILITY, options);

    log.trace("Capabilities: " + caps);

    driver = new RemoteWebDriver(remoteUrl, caps);

(5) Готово. Запускаем тест в контейне Selenoid UI. Всплывающее окно с авторизацией не появится, так как будет обработано с помощью расширения:

В моём случае помог только этот способ.

4 лайка

хм, интересный способ решения проблемы! получается, что если вам надо аутентифицироваться под разными пользователями, то вам надо стартовать новый браузер, где будет подпихнут другой экстеншн с другими креденшиалами для входа

1 лайк

это уже следующий этап работы ))
Сделать так, чтобы файл .crx генерировался динамически в java-коде, с нужными значениями логин/пароля, которые передаём из теста.