¿Cómo lidiar con los certificados utilizando Selenium?

Estoy usando Selenium para lanzar un navegador. ¿Cómo puedo manejar las páginas web (URL) que le pedirán al navegador que acepte un certificado o no?

En Firefox, es posible que tenga un sitio web como ese que me pide que acepte su certificado como este:

Firefox

En el navegador Internet Explorer, puedo obtener algo como esto:

Introduzca la descripción de la imagen aquí

En Google Chrome:

Google Chrome

Repito mi pregunta: ¿Cómo puedo automatizar la aceptación del certificado de un sitio web cuando ejecuto un navegador (Internet Explorer, Firefox y Google Chrome) con Selenium (lenguaje de progtwigción Python) ?

Related of "¿Cómo lidiar con los certificados utilizando Selenium?"

Para Firefox, debe establecer la accept_untrusted_certs FirefoxProfile() en 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() 

Para Chrome, debe agregar el argumento ChromeOptions() --ignore-certificate-errors :

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

Para Internet Explorer, debe configurar la capacidad deseada de acceptSslCerts :

 from selenium import webdriver capabilities = webdriver.DesiredCapabilities().INTERNETEXPLORER capabilities['acceptSslCerts'] = True driver = webdriver.Ie(capabilities=capabilities) driver.get('https://cacert.org/') driver.close() 

En realidad, de acuerdo con la documentación de Desired Capabilities , la configuración de la función acceptSslCerts en True debería funcionar para todos los navegadores, ya que es una capacidad genérica de lectura / escritura:

acceptSslCerts

booleano

Si la sesión debe aceptar todos los certificados SSL de forma predeterminada.


Demostración de trabajo para Firefox:

 >>> from selenium import webdriver 

Estableciendo acceptSslCerts en 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() 

Estableciendo acceptSslCerts en 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() 

Para Firefox:

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

Para Chrome podemos utilizar:

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

Para Internet Explorer podemos utilizar:

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

Para Firefox Python:

El error del certificado autofirmado de Firefox ahora se ha solucionado: acepte ssl cert con marionette firefox webdrive python splinter

“acceptSslCerts” debe reemplazarse por “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") 

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

Para las personas que acuden a esta pregunta relacionada con el cromo sin cabeza a través de Python Selenium, puede encontrar https://bugs.chromium.org/p/chromium/issues/detail?id=721739#c102 para ser útil.

Parece que puedes hacer

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

o algo similar a lo siguiente (puede que tenga que adaptarse a python):

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

En Python de selenium, debe configurar la desired_capabilities como:

 desired_capabilities = { "acceptInsecureCerts": True } 

Elimine todos los certificados excepto el necesario del almacén de certificados de su navegador y luego configure el navegador para seleccionar automáticamente el certificado cuando solo haya un certificado presente.

Crear un perfil y luego un controlador nos ayuda a solucionar el problema del certificado en Firefox:

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

Sólo una actualización con respecto a este problema.

Requieren conductores:

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)

Código

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

Pude hacer esto en .net c # con PhantomJSDriver con Selenium Web Driver 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); } 

Para aquellos que llegan a este problema utilizando Firefox y las soluciones anteriores no funcionan, puede probar el código a continuación (mi respuesta original está aquí ).

 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) 

Y en C # (.net core) usando Selenium.Webdriver y Selenium.Chrome.Webdriver como este:

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

Parece que todavía no tiene una decisión estándar de este problema. En otras palabras, aún no puede decir “Está bien, haga una certificación, independientemente de si es Internet Explorer, Mozilla o Google Chrome”. Pero encontré una publicación que muestra cómo solucionar el problema en Mozilla Firefox. Si está interesado en él, puede consultarlo aquí .