name - selenium webdriver python
¿Cómo lidiar con certificados usando Selenium? (9)
Estoy usando Selenium para iniciar un navegador. ¿Cómo puedo tratar con las páginas web (URL) que le pedirán al navegador que acepte o no un certificado?
En Firefox, puedo tener un sitio web como ese que me pide que acepte su certificado de esta manera:
En el navegador Internet Explorer, puedo obtener algo como esto:
En Google Chrome:
Repito mi pregunta: ¿cómo puedo automatizar la aceptación del certificado de un sitio web cuando abro un navegador (Internet Explorer, Firefox y Google Chrome) con Selenium (lenguaje de programación Python) ?
Crear un perfil y luego un controlador nos ayuda a resolver el problema del certificado en Firefox:
var profile = new FirefoxProfile();
profile.SetPreference("network.automatic-ntlm-auth.trusted-uris","DESIREDURL");
driver = new FirefoxDriver(profile);
Elimine todo, excepto el certificado 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.
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 Firefox Python:
El error del certificado auto firmado de Firefox ahora se ha corregido: acepta el certificado ssl 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")
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 usar:
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("chrome.switches", Arrays.asList("--ignore-certificate-errors"));
driver = new ChromeDriver(capabilities);
Para Internet Explorer podemos usar:
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
Webdriver driver = new InternetExplorerDriver(capabilities);
Para las personas que se acerquen a esta pregunta relacionada con el cromo sin cabeza a través del selenio python, puede encontrar que https://bugs.chromium.org/p/chromium/issues/detail?id=721739#c102 es útil.
Parece que puedes hacer
chrome_options = Options()
chrome_options.add_argument(''--allow-insecure-localhost'')
o algo similar a lo siguiente (puede necesitar adaptarse para python):
ChromeOptions options = new ChromeOptions()
DesiredCapabilities caps = DesiredCapabilities.chrome()
caps.setCapability(ChromeOptions.CAPABILITY, options)
caps.setCapability("acceptInsecureCerts", true)
WebDriver driver = new ChromeDriver(caps)
Parece que todavía no tiene una decisión estándar de este problema. En otras palabras, todavía no puede decir "Está bien, haga una certificación, sea lo que sea si es Internet Explorer, Mozilla o Google Chrome". Pero encontré una publicación que muestra cómo solucionar el problema en Mozilla Firefox. Si le interesa, puede consultarlo here .
Solo una actualización con respecto a este problema.
Requiere controladores:
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();
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 --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()
Para Internet Explorer, debe establecer 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()
De hecho, de acuerdo con la documentación Desired Capabilities
, establecer la capacidad de acceptSslCerts
en True
debería funcionar para todos los navegadores, ya que es una capacidad de lectura / escritura genérica:
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()