Как работать с сертификатами с помощью Selenium?

86

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

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

Fire Fox

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

Введите описание изображения здесь

В Google Chrome:

Гугл Хром

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

Питер Мортенсен
источник

Ответы:

143

Для 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()
алексе
источник
12
Я не могу заставить его работать в IE 11, он просто продолжает показывать мне страницу с
ошибкой
Для firefox 48+ с использованием geckodriver все еще есть проблема, это открытая проблема в geckodriver, они до сих пор понятия не имеют об этом, см. Проблема
Alter Hu
6
Этот ответ больше недействителен, вместо него используйте acceptInsecureCerts
rtaft
2
Этот комментарий может быть очень поздним, но полезен для людей, которые задают вопрос сейчас. Я попробовал все вышеперечисленное, но ничего не помогло. Только удалось передать ошибку с:driver.get("javascript:document.getElementById('overridelink').click()")
Диего Ф Медина
3
для chromedriver я закончил тем, что передал все эти четыре строки в options.add_argument -> allow-running-insecure-contentи and ignore-certificate-errorsand allow-insecure-localhostand unsafely-treat-insecure-origin-as-secure(вы можете попытаться найти больше с помощью: strings /opt/google/chrome/chrome | grep insecureи аналогичного grepping)
pestophagous
8

Для 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);
Сусанта Адхикари
источник
4
Вопрос был о Python. Вы могли бы хотя бы написать, что это за язык.
user1
1
Будьте осторожны, ProfilesIni устарел!
Happy Bird
Надеюсь, что версия java может помочь ChromeOptions options = new ChromeOptions (); параметры .addArguments ("- ignore-ssl-errors = yes", "--ignore-certificate-errors"); Драйвер ChromeDriver = новый ChromeDriver (параметры);
Роберто Петрилли,
6

Для Firefox Python:

Исправлена ​​ошибка самоподписанного сертификата Firefox : принять сертификат ssl с марионеткой 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")
Реми Дебетт
источник
1
И вот Firefox 52 жив. Обновите Firefox , обновите selenium до v3.3, загрузите geckodriver до v0.15, и вам больше не понадобится двоичный путь!
Реми Дебетт
4

И в С # (ядро .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))
{ 
  ...
}
Sgedda
источник
3

Для людей, которые задаются этим вопросом, связанным с безголовым хромом через python selenium, может оказаться полезным 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)
оксер
источник
3
    ChromeOptions options = new ChromeOptions().addArguments("--proxy-server=http://" + proxy);
    options.setAcceptInsecureCerts(true);
Васиста ТВН
источник
1
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причины вашего предложения кода
Ak47
2

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();
Джамиль Ариан
источник
2

Я столкнулся с той же проблемой с 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
Крис
источник
1

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

var profile = new FirefoxProfile();
profile.SetPreference("network.automatic-ntlm-auth.trusted-uris","DESIREDURL");
driver = new FirefoxDriver(profile);
user2062360
источник
3
как насчет Internet Explorer и Google Chrome?
1

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

desired_capabilities = {
    "acceptInsecureCerts": True
}
Наттстер
источник
1

Для тех, кто сталкивается с этой проблемой с помощью 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)
К. Фэн
источник
0

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

изящный код
источник
0

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

Требуются драйверы:

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();
HA S
источник
0

Я смог сделать это на .net С # с PhantomJSDriver с веб-драйвером selenium 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);
    }
user2728409
источник
0

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

В основном он просто использует свои макро-функции, но не работает с настройками без головы.

Джеймс
источник
0

У меня была такая же проблема. Однако, когда я попытался открыть веб-сайт вручную в браузере, сертификат был правильным, но в деталях имя было «НЕ ДОВЕРЯТЬ».

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

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

Glautrou
источник
0
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--ignore-certificate-errors");
driver = new ChromeDriver(options);

Я использовал его для Java с браузером Chrome, он отлично работает

Ритеш
источник
1
Хотя этот код может решить вопрос, в том числе объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов за. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас. Измените свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются.
Дэвид Бак
-3

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

Станимир Якимов
источник
Но как насчет приведенного выше кода, выполненного на Java? Он просит каждый браузер принять сертификат текущего посещаемого веб-сайта. Разве мы не можем сделать то же самое в Python?