it-swarm.com.de

Wie gehe ich mit Zertifikaten um, die Selen verwenden?

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:

Firefox

Im Internet Explorer-Browser kann ich etwa Folgendes erhalten:

Enter image description here

In Google Chrome:

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?

53
user3522371

Für Firefox müssen Sie die Option accept_untrusted_certsFirefoxProfile() 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-errorsChromeOptions() 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()
82
alecxe

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

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")
4
Rémi Debette

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

In Selenium Python müssen Sie desired_capabilities folgendermaßen einstellen:

desired_capabilities = {
    "acceptInsecureCerts": True
}
1
nattster

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. 

0
gracefulcode

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();
0
HA S

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);
    }
0
user2728409

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
0
Chris

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

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);
0
user2062360

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))
{ 
  ...
}
0
Sgedda

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.

0
James