wake-up-neo.net

Headless Chrome + Ignorieren-Zertifikat-Fehler

Ich muss kopfloses Chrom bekommen, um Zertifikatfehler zu ignorieren. Die Option wird im Headless-Modus ignoriert und der Treiber gibt leere HTML-Body-Tags zurück, wenn Sie zu einer https-Ressource navigieren.

<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>

So konfiguriere ich meinen Chrome-Treiber.

 ChromeOptions chromeOptions = new ChromeOptions();
 chromeOptions.addArguments("--headless", "--disable-gpu", "--window-size=1920,1200","--ignore-certificate-errors");

 DesiredCapabilities cap=DesiredCapabilities.chrome();

 cap.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
 cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
 cap.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);
 chromeHeadlessDriver = new ChromeDriver(cap);

Dieser Thread bestätigt, dass --ignore-certificate-errors im Headless-Modus ignoriert wird.

Sie erwähnen etwa das devtool-Protokoll .

Ist es etwas, das ich von Java aus anrufen kann? Gibt es noch andere Alternativen?

18
miklesw

Es gibt einen ausgezeichneten Artikel auf medium.com von sahajamit

und ich habe den folgenden Code getestet, er funktioniert einwandfrei mit selbstsignierten Zertifikaten https://badssl.com/

    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("useAutomationExtension", false);
    options.addArguments("--headless", "--window-size=1920,1200","--ignore-certificate-errors");

    DesiredCapabilities crcapabilities = DesiredCapabilities.chrome();
    crcapabilities.setCapability(ChromeOptions.CAPABILITY, options);
    crcapabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
    crcapabilities.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);

    System.setProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY, "C:\\temp\\chrome\\chromedriver.log");
    System.setProperty(ChromeDriverService.CHROME_DRIVER_EXE_PROPERTY, "C:\\temp\\chrome\\chromedriver.exe");

    ChromeDriverService service = null;
    try {
        service = new ChromeDriverService.Builder()
                .usingAnyFreePort()
                .withVerbose(true)
                .build();
        service.start();
    } catch (IOException e) {
        e.printStackTrace();
    }

    RemoteWebDriver driver = new RemoteWebDriver(service.getUrl(),crcapabilities);

    driver.get("https://self-signed.badssl.com/");
    System.out.println(driver.getPageSource());
    driver.quit();

software-/Framework-Versionen

  • Google Chrome Version 64.0.3282.186
  • Google Chrome-Treiberversion 64.0.3282.186
  • Selen-Version 3.11.0
5
Amila kumara

@ amila-kumara funktioniert, aber die Verwendung von DesiredCapabilities.chrome() gibt eine Warnung zur Verwendung von ChromeOptions aus. Bitte sehen Sie die aktualisierte Antwort.

Legen Sie die Chromoptionswerte fest

System.setProperty("webdriver.chrome.driver", Config.NDAC_WEBDRIVER_PATH);
ChromeOptions options = new ChromeOptions();
options.addArguments("--window-size=1920,1200");
options.setAcceptInsecureCerts(true);
options.setHeadless(true);

Starten Sie den Dienst

ChromeDriverService service = null;
try {
    service = new ChromeDriverService.Builder()
            .usingAnyFreePort()
            .withVerbose(true)
            .build();
    service.start();
    remoteWebdriverUrl = service.getUrl();
    System.out.println("Starting the url " + remoteWebdriverUrl);
} catch (IOException e) {
    e.printStackTrace();
}

Hinweis: Beim Schließen des Treibers (mit RemoteWebDriver) trat das Problem auf, der Prozess chromedriver.exe wird nicht geschlossen, auch wenn Sie driver.quit () verwenden. Um das Problem zu beheben, verwenden Sie ChromeDriver anstelle von RemoteWebDriver.

RemoteWebDriver driver = new ChromeDriver(service, options);

Um den Treiber ordnungsgemäß zu schließen, verwenden Sie

driver.close();
driver.quit();
0