unbekannter Fehler: Chrome konnte nicht gestartet werden: wurde abnormal beendet (Treiberinfo: chromedriver = 2.9

75

Ich versuche, Selenium-Tests unter Debian 7 durchzuführen, aber ohne Erfolg.

Der Fehler ist:

unknown error: Chrome failed to start: exited abnormally   (Driver info: chromedriver=2.9.248316,platform=Linux 3.2.0-4-686-pae x86) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 60.55 seconds Build info: version: '2.33.0', revision: '4ecaf82108b2a6cc6f006aae81961236eba93358', time: '2013-05-22 12:00:17' System info: os.name: 'Linux', os.arch: 'i386', os.version: '3.2.0-4-686-pae', java.version: '1.7.0_25' Driver info: org.openqa.selenium.chrome.ChromeDriver

Ich habe Chromedriver 29 mit Chrome 34.0.1847.76 Beta auf Debian 7 32 Bit . Ich benutze Selen-Java 2.33.0

Nach diesem Link ist der Chromedriver 29 die richtige Version für Chrome 34 . Außerdem funktionieren frühere Versionen unter Debian 7 aufgrund der glibc-Version nicht…

---------- ChromeDriver v2.9 (31.01.2014) ----------
Unterstützt Chrome v31-34

[Update 1]

Ich habe mit Java 7 und Java 6 versucht, immer noch das gleiche Problem. Vielleicht sollte ich es mit Java 8 versuchen ^^

[Update 2]

Ich verwende diesen Befehl, um den Chrome-Treiber zu testen und sicherzustellen, dass dies kein Problem mit Jenkins ist:

curl -X POST -H "Inhaltstyp: application / json; charset = utf-8" -d "{" gewünschte Fähigkeiten ": {" Plattform ":" ANY "," browserName ": "chrome", "chromeOptions": {"args": [], "extensions": []}, "version": "", "chrome.switches" : []}} "localhost: 12495 / session

Ich erhalte die gleiche Fehlermeldung:

{"sessionId": "210f3f837a798ee68cd91f089976d0c2", "status": 13, "value": {"message": "unbekannter Fehler: Chrome konnte nicht gestartet werden: abnormal beendet \ n (Treiberinfo: chromedriver = 2.9.248316, platform = Linux 3.2.0-4-686-pae x86) "}}

Jede Hilfe, um zu wissen, was los ist, wäre dankbar.

Vielen Dank

Redochka
quelle
Jeder, der in der Lage ist, im nicht kopflosen Modus von Jenkins aus zu laufen
SaiPawan

Antworten:

60

Ich habe es endlich geschafft, Selenium-Tests zum Starten des Chrome-Treibers auf meinem Laptop (Server) durchzuführen.

Das Wichtige ist zu verwenden Xvfb. Fragen Sie mich nicht warum, aber wenn Sie diese Tatsache akzeptiert haben, befolgen Sie diese Schritte (detaillierter als @Anon Antwort)

  • Fügen Sie in Ihren Jenkins-Einstellungen eine globale Eigenschaft hinzu

    key : DISPLAY
    value:0:0
    
  • Starten Sie auf Ihrem Server Xvfbim Hintergrund:

     Xvfb :0 -ac -screen 0 1024x768x24 &
    
Redochka
quelle
1
Hinzufügen von Export DISPLAY =: XX wobei XX die Anzahl der Anzeige ist, löst das Problem für mich
Michał Ignaszewski
1
Danke für die Hilfe! Außerdem ein Hinweis, der mir geholfen hätte: Das Festlegen globaler Variablen erfolgt über "Jenkins verwalten -> System konfigurieren -> Globale Eigenschaften"
Robert Townley
Sollte das sein value:0:0oder value: :0?
dps
1
Xvfb bietet eine virtuelle Anzeige zum Rendern des Browsers. Möglicherweise können durch Ausführen von Tests im Headless-Modus auch die Notwendigkeit verringert werden, den Browser so zu rendern, dass Selen sonst auf der virtuellen Anzeige erscheint.
Leo
14

Übergeben Sie den Parameter DISPLAY an Ihren Jenkins-Job?

Ich gehe davon aus, dass Sie versuchen, die Tests auch im Headless-Modus auszuführen. Richten Sie also einen x-Dienst (z. B. Xvfb) ein und übergeben Sie die DISPLAY-Nummer an Ihren Job. Hat für mich gearbeitet.

Anon
quelle
Ich versuche nicht, die Tests im Headless-Modus auszuführen, da ich einen Laptop verwende und den Bildschirm so eingestellt habe, dass er auch bei geschlossenem Deckel eingeschaltet bleibt. Aber kann ich es vielleicht im Headless-Modus versuchen?
Redochka
Hatte dieses Problem auf einem Headless-Server und stellte sicher, dass DISPLAY richtig eingestellt war, um mein Problem zu beheben! Vielen Dank!
sbditto85
10

Ich habe versucht, mit wdio Selen auf Jenkins mit Mocha Framework auszuführen. Die folgenden Schritte zur Lösung dieses Problems sind: -

Installieren Sie Google Chrome

sudo apt-get update 

sudo apt-get install google-chrome-stable

Installieren Sie den Chrome-Treiber

wget http://chromedriver.storage.googleapis.com/2.23/chromedriver_linux64.zip
unzip chromedriver_linux64.zip

Führen Sie die folgenden Befehle aus, um den Selenium-Webserver zu starten

nohup sudo Xvfb :10 -ac
export DISPLAY=:10
java -jar vendor/se/selenium-server-standalone/bin/selenium-server-standalone.jar -Dwebdriver.chrome.bin="/usr/bin/google-chrome" -Dwebdriver.chrome.driver="vendor/bin/chromedriver"

Nach diesem Start testen Sie mit dem Befehl wdio

wdio wdio.conf.js
Harkirat Saluja
quelle
5

Die Lösung des Mike R funktioniert für mich. Dies ist der vollständige Befehlssatz:

Xvfb :99 -ac -screen 0 1280x1024x24 &
export DISPLAY=:99
nice -n 10 x11vnc 2>&1 &

Später können Sie Google-Chrome ausführen:

google-chrome --no-sandbox &

Oder starten Sie Google Chrome über den Selentreiber (zum Beispiel):

ng e2e --serve true --port 4200 --watch true

Protractor.conf Datei:

capabilities: {
    'browserName': 'chrome',
    'chromeOptions': {
        'args': ['no-sandbox']
    }
},
Milso
quelle
xvfb ist ein virtueller Bildschirm irgendwie hilft es, wenn Sie nur Terminal verwenden: en.wikipedia.org/wiki/Xvfb
changtung
1
"irgendwie" ist, weil ein Browser eine grafische Anwendung ist, die eine Anzeige benötigt, um etwas zu rendern
Corey Goldberg
3

Das Übergeben von No-Sandbox an Exec scheint für Jenkins unter Windows im Vordergrund oder als Dienst wichtig zu sein. Hier ist meine Lösung

chromedriver schlägt auf Windows Jenkins Slave fehl, der im Vordergrund läuft

Peter Kahn
quelle
Ich hatte no-sandbox während der Verwendung von Chrom in einem Docker-Container im Headless-Modus (Selen-Webdriver 3 & Ruby on Rails) verwendet.
dps
Das Ausführen als root funktioniert nur, wenn Sie es verwenden --no-sandboxund viele Docker-Container Dinge als root ausführen. Einige (beängstigend konfigurierte) Jenkins-Knoten verwenden möglicherweise auch root. Eine weitere Option, die Sie hinzufügen können, ist --headlessdie vollständige Vermeidung von Xvfb. Möglicherweise benötigen Sie dies auch --disable-dev-shm-usagespeziell in Docker, oder Sie müssen das Mount-Gerät in Ihrem Lauf mit binden --mount type=bind,source=/dev/shm,target=/dev/shm.
Dragon788
3

Wir hatten das gleiche Problem beim Versuch, Selentests von Jenkins aus zu starten. Ich hatte das Feld " Xvfb vor dem Build starten und danach herunterfahren " ausgewählt und die erforderlichen Bildschirmoptionen übergeben, aber ich bekam immer noch diesen Fehler.

Es hat endlich funktioniert, als wir die folgenden Befehle im Feld "Shell ausführen" übergeben haben.

Xvfb :99 -ac -screen 0 1280x1024x24 & nice -n 10 x11vnc 2>&1 & ... killall Xvfb

Mike R.
quelle
Können
Danke, die erste Zeile hat ein Chrome-Treiberskript für mich
Chris G
2
  1. Überprüfen Sie, ob Sie die ChromeDriver-Version verwenden, die Ihrer Chrome-Version entspricht
  2. Wenn Sie unter Linux ohne grafische Oberfläche arbeiten, muss der "Headless" -Modus verwendet werden

Beispiel für WebDriverSettings.java :

...
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("prefs", chromePrefs);
options.addArguments("--no-sandbox");
options.addArguments("--headless"); //!!!should be enabled for Jenkins
options.addArguments("--disable-dev-shm-usage"); //!!!should be enabled for Jenkins
options.addArguments("--window-size=1920x1080"); //!!!should be enabled for Jenkins
driver = new ChromeDriver(options);
...
Alex Langer
quelle
1

Ich verwende ein ähnliches Setup: Selenium 3.40, Chrome 61, Chromedriver 2.33, das mit xvfb unter Ubuntu 16.04 ausgeführt wird.

Ich habe zeitweise den gleichen Chrome-Fehler erhalten. Es scheint, dass der Chromedriver manchmal die mit dem Chrome-Profil verknüpften temporären Dateien nicht bereinigt.

Eine Problemumgehung für mich besteht darin, die temporären Dateien vor dem Ausführen von Tests zu bereinigen:

rm -rf /tmp/.org.chromium.Chromium*

Ich gehe davon aus, dass dies in zukünftigen Versionen von chromedriver behoben wird, aber im Moment löst dies das Problem in meinem Fall.

Andrew Johnston
quelle
1

Ich habe lange mit diesem Problem gekämpft und erst heute habe ich herausgefunden, wie ich es beseitigen kann. Heute kann ich einen 50-Thread-Prozess ausführen, der Selen aufruft, ohne dieses Problem mehr zu sehen, und auch aufhören, meine Maschine mit outofmemory zum Absturz zu bringen Problem mit zu vielen offenen Chromedriver-Prozessen.

  1. Ich verwende Selen 3.7.1, chromedrive 2.33, java.version: '1.8.0', redhat ver '3.10.0-693.5.2.el7.x86_64', Chrome-Browserversion: 60.0.3112.90;
  2. Ausführen einer offenen Sitzung mit Bildschirm, um sicherzustellen, dass meine Sitzung niemals beendet wird,
  3. Ausführen von Xvfb: nohup Xvfb -ac: 15 -screen 0 1280x1024x16 &
  4. export DISPLAY: 15 aus .bashsh / .profile

Diese 4 Elemente sind die Grundeinstellung, die jeder bereits kennen würde. Jetzt kommt der Code, bei dem alle einen großen Unterschied gemacht haben, um den Erfolg zu erzielen:

public class HttpWebClient {
    public static ChromeDriverService service;
    public ThreadLocal<WebDriver> threadWebDriver = new ThreadLocal<WebDriver>(){
    @Override
    protected WebDriver initialValue() {
        FirefoxProfile profile = new FirefoxProfile();
        profile.setPreference("permissions.default.stylesheet", 2);
        profile.setPreference("permissions.default.image", 2);
        profile.setPreference("dom.ipc.plugins.enabled.libflashplayer.so", "false");
        profile.setPreference(FirefoxProfile.ALLOWED_HOSTS_PREFERENCE, "localhost");
        WebDriver driver = new FirefoxDriver(profile);
        return driver;
    };
};

public HttpWebClient(){
    // fix for headless systems:
    // start service first, this will create an instance at system and every time you call the 
    // browser will be used
    // be sure you start the service only if there are no alive instances, that will prevent you to have 
    // multiples chromedrive instances causing it to crash
    try{
        if (service==null){
            service = new ChromeDriverService.Builder()
            .usingDriverExecutable(new File(conf.get("webdriver.chrome.driver"))) // set the chromedriver path at your system
            .usingAnyFreePort()
            .withEnvironment(ImmutableMap.of("DISPLAY", ":15"))
            .withSilent(true)
            .build();
            service.start();
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

// my Configuration class is for good and easy setting, you can replace it by using values instead.
public WebDriver getDriverForPage(String url, Configuration conf) {
    WebDriver driver = null;
    DesiredCapabilities capabilities = null;
    long pageLoadWait = conf.getLong("page.load.delay", 60);

    try {
            System.setProperty("webdriver.chrome.driver", conf.get("webdriver.chrome.driver"));
            String driverType = conf.get("selenium.driver", "chrome");

        capabilities = DesiredCapabilities.chrome();
        String[] options = new String[] { "--start-maximized", "--headless" };
        capabilities.setCapability("chrome.switches", options);

                    // here is where your chromedriver will call the browser
                    // I used to call the class ChromeDriver directly, which was causing too much problems 
                    // when you have multiple calls
        driver = new RemoteWebDriver(service.getUrl(), capabilities);

        driver.manage().timeouts().pageLoadTimeout(pageLoadWait, TimeUnit.SECONDS);
        driver.get(url);

                    // never look back

    } catch (Exception e) {
        if (e instanceof TimeoutException) {
            LOG.debug("Crawling URL : "+url);
            LOG.debug("Selenium WebDriver: Timeout Exception: Capturing whatever loaded so far...");
            return driver;
        }
        cleanUpDriver(driver);
        throw new RuntimeException(e);
    }
    return driver;
}

public void cleanUpDriver(WebDriver driver) {
    if (driver != null) {
        try {
                            // be sure to close every driver you opened
            driver.close();
            driver.quit();
            //service.stop(); do not stop the service, bcz it is needed
            TemporaryFilesystem.getDefaultTmpFS().deleteTemporaryFiles();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

}}

Viel Glück und ich hoffe, Sie sehen dieses Absturzproblem nicht mehr

Bitte kommentieren Sie Ihren Erfolg

Freundliche Grüße,

Wilson
quelle
1

Unter Linux hat mir das Hinzufügen dieser Zeilen zu meinem Code geholfen.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options


chrome_options = Options()
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-sandbox")
driver = webdriver.Chrome(options=chrome_options)

driver.get("www.counterviews.online")
Siddy Hacks
quelle
0

Das Exportieren der DISPLAYVariablen ist definitiv die Lösung, aber abhängig von Ihrem Setup müssen Sie dies möglicherweise auf eine etwas andere Weise tun.

In meinem Fall habe ich zwei verschiedene Prozesse: Der erste startet Xvfb, der andere startet die Tests. Mein Shell-Scripting-Wissen ist also etwas verrostet, aber ich habe herausgefunden, dass der Export der DISPLAYVariablen aus dem ersten Prozess sie im zweiten Prozess nicht verfügbar gemacht hat.

Glücklicherweise können Sie mit Selenium WebDriver Ihre Umgebung neu definieren. Dies ist meine Funktion zum Erstellen eines Treibers für Chrome in JS. Ziemlich sicher, dass das Äquivalent für Ihre Programmiersprache existiert:

const caps = require('selenium-webdriver/lib/capabilities');
const chrome = require('selenium-webdriver/chrome');
const chromedriver = require('chromedriver');

module.exports = function (cfg) {
    let serviceBuilder = new chrome.ServiceBuilder(chromedriver.path);
    let options = chrome.Options.fromCapabilities(caps.Capabilities.chrome());
    let service;
    let myENV = new Map();

    // 're-export' the `DISPLAY` variable
    myENV.set('DISPLAY', ':1');
    serviceBuilder.setEnvironment(myENV);

    service = serviceBuilder.build();

    options.addArguments('disable-setuid-sandbox');
    options.addArguments('no-sandbox');
    options.addArguments('allow-insecure-localhost');
    options.excludeSwitches('test-type');

    return chrome.Driver.createSession(options, service);
};
Customcommander
quelle
Sie können Ihr xvfb-Startskript in der aktuellen Shell-Kontextumgebung ausführen ( stackoverflow.com/questions/16618071/… ) :. xvfb.sh
Milso
0

Ich hatte ein ähnliches Problem mit Maven-Tests unter x86 Linux, die ich im Terminal verwendete. Ich habe mich mit ssh bei Linux angemeldet . Ich habe meine Java-Selen-Tests mit begonnen

mvn -DargLine="-Dbaseurl=http://http://127.0.0.1:8080/web/" install

Mit Ausnahme meiner App erhielt ich nach dem Ausführen dieser Tests eine Fehlermeldung in den Protokollen:

unknown error: Chrome failed to start: exited abnormally

Ich habe diese Tests als Root-Benutzer ausgeführt. Vor diesem Fehler habe ich erhalten, dass ChromeDriver nicht vorhanden ist. Ich habe dies fortgesetzt, indem ich ChromeDriver-Binärdateien installiert und zu PATH hinzugefügt habe. Aber dann musste ich den Google-Chrome-Browser installieren - ChromeDriver allein reicht nicht aus, um Tests durchzuführen. Der Fehler ist also möglicherweise ein Problem mit dem Bildschirmpuffer im Terminalfenster, aber Sie können Xvfb installieren, bei dem es sich um einen virtuellen Bildschirmpuffer handelt. Wichtig ist, dass Sie Ihre Tests nicht als Root ausführen, da möglicherweise ein weiterer Chrome-Browserfehler angezeigt wird. Also nein als root laufe ich:

export DISPLAY=:99
Xvfb :99 -ac -screen 0 1280x1024x24 &

Was hier wichtig ist, ist, dass in meinem Fall die mit DISPLAY verbundene Nummer mit dem Parameter Xvfb: NN identisch sein sollte. 99 in diesem Fall. Ich hatte ein anderes Problem, weil ich Xvfb mit einem anderen DISPLAY-Wert ausgeführt habe und wollte, dass es aufhört. So starten Sie Xvfb neu:

ps -aux | grep Xvfb
kill -9 PID
sudo rm /tmp/.X11-unix/X99

Finden Sie also eine Prozess-PID mit grep. Töte den Xvfb-Prozess. Und dann gibt es eine Sperre in /tmp/.X11-unix/XNN. Löschen Sie diese Sperre und Sie können den Server erneut starten. Wenn Sie nicht als Root ausgeführt werden, ähnliche Anzeigen festlegen, Google-Chrome installieren und mit Maven Selentests starten können. Meine Tests verliefen gut mit diesen Regeln und Operationen.

Changtung
quelle
0

Ich bin mir nicht sicher, ob dies alle anderen aufhält, aber ich habe dies behoben, indem ich chromedriver aktualisiert und dann sichergestellt habe, dass es sich an einem Ort befindet, von dem mein Benutzer lesen kann (es scheint, dass viele Leute, die darauf stoßen, es aus Berechtigungsgründen wie mir sehen). .

Unter Ubuntu 16.04: 1. Chromedriver herunterladen (Version 2.37 für mich) 2. Datei entpacken 3. An einem sinnvollen Ort installieren (ich habe / usr / local / bin / chromedriver gewählt)

Muss nicht einmal meinem Benutzer gehören, solange es global ausführbar ist ( sudo chmod +x /usr/local/bin/chromedriver)

Robert Townley
quelle
0

Ich erhöhe den maximalen Speicher, um Node-Chrome zu starten -Xmx3g, und es funktioniert für mich

袁文涛
quelle
0

Du brauchst kein Xvfb

Der Start kann aufgrund einer Nichtübereinstimmung zwischen der Chrome-Version und der Chromedriver-Version fehlschlagen. Das Herunterladen und Installieren derselben oder der neuesten Versionen würde das Problem lösen.

Rajesh Gupta
quelle