Подтвердить что ты не робот

Как справляться с сертификатами, использующими Selenium?

Я использую Selenium для запуска браузера. Как я могу работать с веб-страницами (URL-адресами), которые будут запрашивать у браузера сертификат или нет?

В Firefox у меня может быть такой веб-сайт, который просит меня принять его сертификат следующим образом:

Firefox

В браузере Internet Explorer я могу получить что-то вроде этого:

Enter image description here

В Google Chrome:

Google Chrome

Я повторяю свой вопрос: Как я могу автоматизировать принятие сертификата веб-сайта при запуске браузера (Internet Explorer, Firefox и Google Chrome) с Selenium (языком программирования Python)?

4b9b3361

Ответ 1

Для Firefox вам необходимо установить для параметра accept_untrusted_certs FirefoxProfile() значение True:

from selenium import webdriver

profile = webdriver.FirefoxProfile()
profile.accept_untrusted_certs = True

driver = webdriver.Firefox(firefox_profile=profile)
driver.get('https://cacert.org/')

driver.close()

Для Chrome вам нужно добавить аргумент --ignore-certificate-errors ChromeOptions():

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')

driver = webdriver.Chrome(chrome_options=options)
driver.get('https://cacert.org/')

driver.close()

Для Internet Explorer вам необходимо установить acceptSslCerts желаемую возможность:

from selenium import webdriver

capabilities = webdriver.DesiredCapabilities().INTERNETEXPLORER
capabilities['acceptSslCerts'] = True

driver = webdriver.Ie(capabilities=capabilities)
driver.get('https://cacert.org/')

driver.close()

Собственно, в соответствии с Desired Capabilities документацией установка acceptSslCerts на True должна работать для всех браузеров, поскольку это универсальная возможность чтения/записи

acceptSslCerts

булево

Должен ли сеанс принимать все сертификаты SSL по умолчанию.


Рабочая демонстрация для Firefox:

>>> from selenium import webdriver

Настройка acceptSslCerts на False:

>>> capabilities = webdriver.DesiredCapabilities().FIREFOX
>>> capabilities['acceptSslCerts'] = False
>>> driver = webdriver.Firefox(capabilities=capabilities)
>>> driver.get('https://cacert.org/')
>>> print(driver.title)
Untrusted Connection
>>> driver.close()

Настройка acceptSslCerts на True:

>>> capabilities = webdriver.DesiredCapabilities().FIREFOX
>>> capabilities['acceptSslCerts'] = True
>>> driver = webdriver.Firefox(capabilities=capabilities)
>>> driver.get('https://cacert.org/')
>>> print(driver.title)
Welcome to CAcert.org
>>> driver.close()

Ответ 2

Для Firefox:

ProfilesIni profile = new ProfilesIni();
FirefoxProfile myprofile = profile.getProfile("default");
myprofile.setAcceptUntrustedCertificates(true);
myprofile.setAssumeUntrustedCertificateIssuer(true);
WebDriver driver = new FirefoxDriver(myprofile);

Для Chrome мы можем использовать:

DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("chrome.switches", Arrays.asList("--ignore-certificate-errors"));
driver = new ChromeDriver(capabilities);

Для Internet Explorer мы можем использовать:

DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);      
Webdriver driver = new InternetExplorerDriver(capabilities);

Ответ 3

Для Firefox Python:

Исправлена ​​ошибка с самозаверяющим браузером Firefox: принять ssl cert с марионеткой firefox webdrive python splinter

"acceptSslCerts" следует заменить на "acceptInsecureCerts"

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

caps = DesiredCapabilities.FIREFOX.copy()
caps['acceptInsecureCerts'] = True
ff_binary = FirefoxBinary("path to the Nightly binary")

driver = webdriver.Firefox(firefox_binary=ff_binary, capabilities=caps)
driver.get("https://expired.badssl.com")

Ответ 4

JavaScript:

const capabilities = webdriver.Capabilities.phantomjs();
capabilities.set(webdriver.Capability.ACCEPT_SSL_CERTS, true);
capabilities.set(webdriver.Capability.SECURE_SSL, false);
capabilities.set('phantomjs.cli.args', ['--web-security=no', '--ssl-protocol=any', '--ignore-ssl-errors=yes']);
const driver = new webdriver.Builder().withCapabilities(webdriver.Capabilities.chrome(), capabilities).build();

Ответ 5

Для людей, приходящих на этот вопрос, связанных с безголовым хромом через селен python, вы можете найти https://bugs.chromium.org/p/chromium/issues/detail?id=721739#c102.

Похоже, вы можете либо сделать

chrome_options = Options()
chrome_options.add_argument('--allow-insecure-localhost')

или что-то вроде следующих (возможно, потребуется адаптировать для python):

ChromeOptions options = new ChromeOptions()
DesiredCapabilities caps = DesiredCapabilities.chrome()
caps.setCapability(ChromeOptions.CAPABILITY, options)
caps.setCapability("acceptInsecureCerts", true)
WebDriver driver = new ChromeDriver(caps)

Ответ 6

В selenium python вам нужно установить desired_capabilities как:

desired_capabilities = {
    "acceptInsecureCerts": True
}

Ответ 7

Для тех, кто приходит к этой проблеме с помощью Firefox и вышеприведенных решений, не работает, вы можете попробовать код ниже (мой оригинальный ответ здесь).

from selenium import webdriver

profile = webdriver.FirefoxProfile()
profile.DEFAULT_PREFERENCES['frozen']['marionette.contentListener'] = True
profile.DEFAULT_PREFERENCES['frozen']['network.stricttransportsecurity.preloadlist'] = False
profile.DEFAULT_PREFERENCES['frozen']['security.cert_pinning.enforcement_level'] = 0
profile.set_preference('webdriver_assume_untrusted_issuer', False)
profile.set_preference("browser.download.folderList", 2)
profile.set_preference("browser.download.manager.showWhenStarting", False)
profile.set_preference("browser.download.dir", temp_folder)
profile.set_preference("browser.helperApps.neverAsk.saveToDisk",
                   "text/plain, image/png")
driver = webdriver.Firefox(firefox_profile=profile)

Ответ 8

Создание профиля, а затем драйвера помогает обойти проблему сертификата в Firefox:

var profile = new FirefoxProfile();
profile.SetPreference("network.automatic-ntlm-auth.trusted-uris","DESIREDURL");
driver = new FirefoxDriver(profile);

Ответ 9

Удалите все, кроме необходимого сертификата, из хранилища сертификатов браузера, а затем настройте браузер для автоматического выбора сертификата, если присутствует только один сертификат.

Ответ 10

Просто обновите эту проблему.

Требовать драйверы:

Linux: Centos 7 64bit, Window 7 64bit

Firefox: 52.0.3

Selenium Webdriver: 3.4.0 (Windows), 3.8.1 (Linux Centos)

GeckoDriver: v0.16.0 (Windows), v0.17.0 (Linux Centos)

Код

System.setProperty("webdriver.gecko.driver", "/home/seleniumproject/geckodrivers/linux/v0.17/geckodriver");

ProfilesIni ini = new ProfilesIni();


// Change the profile name to your own. The profile name can 
// be found under .mozilla folder ~/.mozilla/firefox/profile. 
// See you profile.ini for the default profile name

FirefoxProfile profile = ini.getProfile("default"); 

DesiredCapabilities cap = new DesiredCapabilities();
cap.setAcceptInsecureCerts(true);

FirefoxBinary firefoxBinary = new FirefoxBinary();

GeckoDriverService service =new GeckoDriverService.Builder(firefoxBinary)
    .usingDriverExecutable(new 
File("/home/seleniumproject/geckodrivers/linux/v0.17/geckodriver"))
    .usingAnyFreePort()
    .usingAnyFreePort()
    .build();
try {
    service.start();
} catch (IOException e) {
    e.printStackTrace();
}

FirefoxOptions options = new FirefoxOptions().setBinary(firefoxBinary).setProfile(profile).addCapabilities(cap);

driver = new FirefoxDriver(options);
driver.get("https://www.google.com");

System.out.println("Life Title -> " + driver.getTitle());
driver.close();

Ответ 11

Я смог сделать это на.net С# с помощью PhantomJSDriver с веб-драйвером селена 3.1

 [TestMethod]
    public void headless()
    {


        var driverService = PhantomJSDriverService.CreateDefaultService(@"C:\Driver\phantomjs\");
        driverService.SuppressInitialDiagnosticInformation = true;
        driverService.AddArgument("--web-security=no");
        driverService.AddArgument("--ignore-ssl-errors=yes");
        driver = new PhantomJSDriver(driverService);

        driver.Navigate().GoToUrl("XXXXXX.aspx");

        Thread.Sleep(6000);
    }

Ответ 12

А в С# (ядро .net), используя Selenium.Webdriver и Selenium.Chrome.Webdriver вот так:

ChromeOptions options = new ChromeOptions();
options.AddArgument("--ignore-certificate-errors");
using (var driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),options))
{ 
  ...
}

Ответ 13

Всякий раз, когда я сталкиваюсь с этой проблемой в более новых браузерах, я просто использую AppRobotic Personal edition, чтобы щелкать по конкретным координатам экрана, или нажимать на кнопки и нажимать.

По сути, он просто использует свою макрофункцию, но не будет работать на установках без головы.

Ответ 14

Я столкнулся с той же проблемой с Selenium и Behat. Если вы хотите передать параметры через behat.yml, вот как это должно выглядеть:

default:
    extensions:
        Behat\MinkExtension:
            base_url: https://my-app.com
            default_session: selenium2
            selenium2:
                browser: firefox
                capabilities:
                    extra_capabilities:
                        acceptInsecureCerts: true

Ответ 15

У меня была точно такая же проблема. Однако, когда я попытался открыть веб-сайт вручную в браузере, сертификат был верным, но в деталях он назывался "DONOTTRUST".

Разница в сертификате была вызвана тем, что Fiddler работал в фоновом режиме и расшифровывал все содержимое HTTPS перед его повторным шифрованием.

Чтобы исправить мою проблему, просто закройте Fiddler на машине. Если вам нужно оставить Fiddler открытым, то вы можете снять флажок Расшифровать SSL в настройках Fiddler.

Ответ 16

Похоже, что до сих пор нет стандартного решения этой проблемы. Другими словами, вы все еще не можете сказать "Хорошо, сделайте сертификацию, независимо от того, что вы интернет-браузер, Mozilla или Google Chrome". Но я нашел одно сообщение, в котором показано, как обойти проблему в Mozilla Firefox. Если вас это интересует, вы можете проверить его здесь.