web-dev-qa-db-fra.com

Comment traiter les certificats avec Selenium?

J'utilise Selenium pour lancer un navigateur. Comment puis-je gérer les pages Web (URL) qui demanderont au navigateur d’accepter un certificat ou non?

Dans Firefox, il se peut qu'un site Web comme celui-ci me demande d'accepter son certificat comme suit:

Firefox

Sur le navigateur Internet Explorer, je peux obtenir quelque chose comme ceci:

Enter image description here

Sur Google Chrome:

Google Chrome

Je répète ma question: Comment puis-je automatiser l'acceptation du certificat d'un site Web lorsque je lance un navigateur (Internet Explorer, Firefox et Google Chrome) avec Selenium (langage de programmation Python)?

53
user3522371

Pour Firefox, vous devez définir l'option accept_untrusted_certsFirefoxProfile() sur 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()

Pour Chrome, vous devez ajouter l’argument --ignore-certificate-errorsChromeOptions():

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()

Pour Internet Explorer, vous devez définir acceptSslCerts capacité souhaitée:

from Selenium import webdriver

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

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

driver.close()

En fait, selon le Desired Capabilities documentation , définir la capacité acceptSslCerts sur True devrait fonctionner pour tous les navigateurs puisqu'il s'agit d'une capacité générique de lecture/écriture:

acceptSslCerts

booléen

Si la session doit accepter tous les certificats SSL par défaut.


Démo de travail pour Firefox:

>>> from Selenium import webdriver

Régler 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()

Régler 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()
82
alecxe

Pour Firefox:

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

Pour Chrome nous pouvons utiliser:

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

Pour Internet Explorer nous pouvons utiliser:

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

Pour Firefox Python:

Le bogue du certificat auto-signé de Firefox a maintenant été corrigé: accepte le certificat SSL avec marionette firefox webdrive python splinter

"acceptSslCerts" doit être remplacé par "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
Rémi Debette

Pour les personnes qui viennent à cette question liée au chrome sans tête via Python Selenium, vous pouvez trouver https://bugs.chromium.org/p/chromium/issues/detail?id=721739#c102 d'être utile. 

On dirait que vous pouvez soit faire

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

ou quelque chose comme ce qui suit (il faudra peut-être s’adapter pour python):

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

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
Jamil Aryan

Dans Selenium Python, vous devez définir desired_capabilities comme suit:

desired_capabilities = {
    "acceptInsecureCerts": True
}
1
nattster

Supprimez tous les certificats sauf le certificat nécessaire du magasin de certificats de votre navigateur, puis configurez le navigateur pour qu'il sélectionne automatiquement le certificat lorsqu'un seul certificat est présent. 

0
gracefulcode

J'ai pu le faire sur .net c # avec PhantomJSDriver avec le pilote Web 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);
    }
0
user2728409

Pour ceux qui abordent ce problème en utilisant Firefox et que les solutions ci-dessus ne fonctionnent pas, essayez le code ci-dessous (ma réponse originale est ici ).

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
C. Feng

La création d’un profil, puis d’un pilote, nous aide à résoudre le problème des certificats dans Firefox:

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

Et en C # (noyau .net) en utilisant Selenium.Webdriver et Selenium.Chrome.Webdriver comme ceci:

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

Chaque fois que je rencontre ce problème avec les nouveaux navigateurs, j'utilise simplement AppRobotic Personal edition pour cliquer sur les coordonnées de l'écran, ou pour naviguer entre les boutons et cliquer.

Fondamentalement, il utilise simplement sa fonctionnalité de macro, mais ne fonctionnera pas sur les configurations sans tête.

0
James