Ich benutze Selen , um einen Browser zu starten. Wie kann ich mit den Webseiten (URLs) umgehen, die den Browser dazu auffordern, ein Zertifikat zu akzeptieren oder nicht?
In Firefox habe ich möglicherweise eine Website, auf der ich aufgefordert wird, das Zertifikat wie folgt zu akzeptieren:
Im Internet Explorer-Browser kann ich etwa Folgendes erhalten:
In Google Chrome:
Ich wiederhole meine Frage: Wie kann ich die Annahme eines Website-Zertifikats automatisieren, wenn ich einen Browser (Internet Explorer, Firefox und Google Chrome) mit Selenium (Python-Programmiersprache) starte?
Für Firefox müssen Sie die Option accept_untrusted_certs
FirefoxProfile()
auf True
setzen:
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()
Für Chrome müssen Sie das Argument --ignore-certificate-errors
ChromeOptions()
hinzufügen:
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()
Für den Internet Explorer müssen Sie die gewünschte Option acceptSslCerts
einstellen:
from Selenium import webdriver
capabilities = webdriver.DesiredCapabilities().INTERNETEXPLORER
capabilities['acceptSslCerts'] = True
driver = webdriver.Ie(capabilities=capabilities)
driver.get('https://cacert.org/')
driver.close()
Gemäß der Desired Capabilities
-Dokumentation sollte die Einstellung von acceptSslCerts
auf True
für alle Browser funktionieren, da dies eine generische Lese-/Schreibfunktion ist:
acceptSslCerts
boolean
Gibt an, ob die Sitzung alle SSL-Zertifikate akzeptieren soll standardmäßig.
Arbeitsdemo für Firefox:
>>> from Selenium import webdriver
acceptSslCerts
auf False
setzen:
>>> 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
auf True
setzen:
>>> 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()
Für Firefox:
ProfilesIni profile = new ProfilesIni();
FirefoxProfile myprofile = profile.getProfile("default");
myprofile.setAcceptUntrustedCertificates(true);
myprofile.setAssumeUntrustedCertificateIssuer(true);
WebDriver driver = new FirefoxDriver(myprofile);
Für Chrome können wir verwenden:
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("chrome.switches", Arrays.asList("--ignore-certificate-errors"));
driver = new ChromeDriver(capabilities);
Für Internet Explorer können wir verwenden:
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
Webdriver driver = new InternetExplorerDriver(capabilities);
Für Firefox Python:
Der selbstsignierte Firefox-Zertifikatfehler wurde behoben: akzeptieren Sie SSL-Zertifikat mit Marionette Firefox Webdrive Python Splinter
"acceptSslCerts" sollte durch "acceptInsecureCerts" ersetzt werden
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")
Für Personen, die zu dieser Frage im Zusammenhang mit Headless-Chrom über Python-Selenium kommen, ist https://bugs.chromium.org/p/chromium/issues/detail?id=721739#c102 hilfreich.
Es sieht so aus, als könnten Sie es tun
chrome_options = Options()
chrome_options.add_argument('--allow-insecure-localhost')
oder etwas in der Art des Folgenden (möglicherweise müssen Sie sich für Python anpassen):
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();
In Selenium Python müssen Sie desired_capabilities
folgendermaßen einstellen:
desired_capabilities = {
"acceptInsecureCerts": True
}
Löschen Sie alle Zertifikate außer dem erforderlichen Zertifikat aus dem Zertifikatsspeicher Ihres Browsers, und konfigurieren Sie den Browser so, dass das Zertifikat automatisch ausgewählt wird, wenn nur ein Zertifikat vorhanden ist.
Nur ein Update zu diesem Thema.
Treiber erforderlich:
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)
Code
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();
Ich konnte dies auf .net c # mit PhantomJSDriver mit Selenium-Web-Treiber 3.1 durchführen
[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);
}
Ich bin mit Selen und Behat auf dasselbe Problem gestoßen. Wenn Sie die Parameter über behat.yml
Übergeben möchten, muss dies folgendermaßen aussehen:
default:
extensions:
Behat\MinkExtension:
base_url: https://my-app.com
default_session: Selenium2
Selenium2:
browser: firefox
capabilities:
extra_capabilities:
acceptInsecureCerts: true
Für diejenigen, die mit Firefox zu diesem Problem kommen und die obigen Lösungen nicht funktionieren, können Sie den folgenden Code ausprobieren (meine ursprüngliche Antwort ist hier ).
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)
Das Erstellen eines Profils und eines Treibers hilft uns, die Zertifikatsausgabe in Firefox zu umgehen:
var profile = new FirefoxProfile();
profile.SetPreference("network.automatic-ntlm-auth.trusted-uris","DESIREDURL");
driver = new FirefoxDriver(profile);
Und in C # (.net core) mit Selenium.Webdriver
und Selenium.Chrome.Webdriver
wie folgt
ChromeOptions options = new ChromeOptions();
options.AddArgument("--ignore-certificate-errors");
using (var driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),options))
{
...
}
Immer wenn ich mit neueren Browsern auf dieses Problem stoße, verwende ich nur AppRobotic Personal Edition, um auf bestimmte Bildschirmkoordinaten zu klicken, oder navigiere über die Schaltflächen und klicke.
Grundsätzlich verwendet es nur die Makrofunktionalität, funktioniert jedoch nicht bei Headless-Setups.