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:
Sur le navigateur Internet Explorer, je peux obtenir quelque chose comme ceci:
Sur 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)?
Pour Firefox, vous devez définir l'option accept_untrusted_certs
FirefoxProfile()
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-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()
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()
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);
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")
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)
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();
Dans Selenium Python, vous devez définir desired_capabilities
comme suit:
desired_capabilities = {
"acceptInsecureCerts": True
}
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.
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);
}
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)
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);
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))
{
...
}
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.