web-dev-qa-db-fra.com

erreur inconnue: Chrome n'a pas pu démarrer: sortie anormale (informations sur le pilote: chromedriver = 2.9

J'essaie d'exécuter des tests Selenium sur Debian 7 mais sans succès.

L'erreur est:

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

J'ai chromedriver 29 avec chrome 34.0.1847.76 beta fonctionnant sur Debian 7 32 bits . J'utilise Selenium-Java 2.33.0

Après ceci lien , chromedriver 29 est la bonne version pour chrome 34 . Et de toute façon, les versions précédentes ne fonctionnent pas sur Debian 7 à cause de la version de glibc…

 ---------- ChromeDriver v2.9 (2014-01-31) ---------- 
 Prend en charge Chrome v31-34 

[mise à jour 1]

J'ai essayé avec les deux Java 7 et Java 6 , toujours le même problème. Peut-être que je devrais essayer avec Java 8 ^^

[update 2]

J'utilise cette commande pour tester le pilote chrome, afin de m'assurer que ce n'est pas un problème avec jenkins:

 curl -X POST -H "type de contenu: application/json; charset = utf-8" -d "{\" désirés capacités\": {\" plateforme\": \" ANY\", \" Nom du navigateur\": \" chrome\", \" chromeOptions\": {\" args\": [], \" extensions\": []}, \" version\": \"\", \" chrome.switches\": []}}" localhost: 12495/session 

Je reçois le même message d'erreur:

 {"sessionId": "210f3f837a798ee68cd91f089976d0c2", "status": 13, "valeur": {"message": "erreur inconnue: Chrome n'a pas pu démarrer: sortie anormale\n (informations sur le pilote: chromedriver = 2.9.248316, plate-forme = Linux 3.2.0-4-686-pae x86) "}} 

Toute aide pour savoir ce qui se passe serait appréciée.

Merci

73
redochka

J'ai finalement réussi à faire les tests Selenium à partir du Chrome Pilote sur mon ordinateur portable (serveur).

Le bit important est d’utiliser Xvfb. Ne me demandez pas pourquoi mais une fois que vous aurez accepté ce fait, suivez ces étapes (plus en détail que la réponse de @Anon)

  • Dans vos paramètres Jenkins ajouter une propriété globale

    key : DISPLAY
    value:0:0
    
  • Sur votre serveur, démarrez Xvfb en arrière-plan:

     Xvfb :0 -ac -screen 0 1024x768x24 &
    
59
redochka

Passez-vous le paramètre DISPLAY à votre travail Jenkins?

Je suppose que vous essayez également d'exécuter les tests en mode sans tête. Installez donc un service x (c'est-à-dire Xvfb) et transmettez le numéro DISPLAY à votre travail. Travaillé pour moi.

13
Anon

J'essayais d'exécuter Selenium sur Jenkins avec un framework Mocha en utilisant wdio. Voici donc les étapes à suivre pour résoudre ce problème: -

Installer Google Chrome

Sudo apt-get update 

Sudo apt-get install google-chrome-stable

Installer le pilote chrome

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

Exécutez les commandes suivantes pour démarrer le serveur Web Selenium

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"

Après cela, lancez les tests avec la commande wdio

wdio wdio.conf.js
9
Harkirat Saluja

La solution de Mike R fonctionne pour moi. Ceci est l'ensemble complet des commandes:

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

Plus tard, vous pouvez exécuter google-chrome:

google-chrome --no-sandbox &

Ou lancez Google chrome via le pilote Selenium (par exemple):

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

Fichier Protractor.conf:

capabilities: {
    'browserName': 'chrome',
    'chromeOptions': {
        'args': ['no-sandbox']
    }
},
4
Milso

Nous avons eu le même problème en essayant de lancer des tests Selenium à partir de Jenkins. J'avais sélectionné la case 'Démarrer Xvfb avant la construction, puis l'éteindre après' et passé les options d'écran requises, mais je continuais à avoir cette erreur.

Cela a finalement fonctionné lorsque nous avons passé les commandes suivantes dans la boîte de dialogue Exécuter Shell.

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

3
Mike R

Passer no-sandbox à exec semble important pour Jenkins sur les fenêtres au premier plan ou en tant que service. Voici ma solution

chromedriver échoue sur l'esclave Windows Jenkins exécuté au premier plan

2
Peter Kahn

Je me bats avec ce problème depuis longtemps, et aujourd'hui, je découvre comment le résoudre. Aujourd'hui, je peux exécuter un processus à 50 threads appelant Selenium sans plus voir ce problème et également arrêter de planter ma machine avec mémoire. problème avec trop de processus ouverts chromedriver.

  1. J'utilise Selenium 3.7.1, chromedrive 2.33, Java.version: '1.8.0', redhat ver '3.10.0-693.5.2.el7.x86_64', chrome version du navigateur: 60.0.3112.90;
  2. exécuter une session ouverte avec screen, pour être sûr que ma session ne meurt jamais,
  3. en cours d'exécution Xvfb: Nohup Xvfb -ac: 15 -screen 0 1280x1024x16 &
  4. exportation AFFICHAGE: 15 à partir de .bashsh/.profile

ces 4 éléments constituent le réglage de base que tout le monde connaissait déjà. Vient maintenant le code, où tous ont grandement contribué à la réussite:

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

}

Bonne chance et j'espère que vous ne verrez plus ce problème d'accident

S'il vous plaît commenter votre succès

Meilleures salutations,

1
Wilson

J'utilise une configuration similaire: Selenium 3.40, Chrome 61, chromedriver 2.33 fonctionnant avec xvfb sous Ubuntu 16.04.

J'obtenais la même erreur Chrome par intermittence. Il semble que parfois, chromedriver ne parvient pas à nettoyer les fichiers temporaires associés au profil Chrome.

Une solution pour moi consiste à nettoyer les fichiers temporaires avant d'exécuter des tests:

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

J'espère que cela sera résolu dans les versions futures de chromedriver, mais pour l'instant, cela résout le problème dans mon cas.

1
Andrew Johnston

J'ai eu un problème simillar avec des tests Maven sur Linux x86 que j'utilisais dans le terminal. Je me connectais à Linux par ssh. J'ai commencé mes Java tests Selenium par

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

À l'exception de mon application, après l'exécution de ces tests, une erreur s'est produite dans les journaux:

unknown error: Chrome failed to start: exited abnormally

J'exécutais ces tests en tant qu'utilisateur root. Avant cette erreur, j'ai reçu que ChromeDriver n'est ni présent. J'ai avancé avec cela en installant le binaire ChromeDriver et en l'ajoutant à PATH. Mais ensuite, j'ai dû installer le navigateur google-chrome - ChromeDriver seul ne suffit pas pour exécuter des tests. L'erreur est donc peut-être un problème avec le tampon d'écran dans la fenêtre du terminal, mais vous pouvez installer Xvfb qui est un tampon d'écran virtuel. Ce qui est important, c'est que vous deviez exécuter vos tests non en tant que root, car vous pourriez recevoir un autre Chrome Erreur du navigateur. Donc, non en tant que root, exécutez-le:

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

Ce qui est important ici, c'est que dans mon cas, le nombre associé à DISPLAY devrait être identique au paramètre Xvfb: NN. 99 dans ce cas. J'ai eu un autre problème parce que j'ai lancé Xvfb avec une autre valeur DISPLAY et que je voulais que cela cesse. Pour redémarrer Xvfb:

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

Recherchez donc un PID de processus avec grep. Tuer le processus Xvfb. Et puis il y a un verrou dans /tmp/.X11-unix/XNN, alors supprimez ce verrou et vous pourrez redémarrer le serveur. Si vous n’exécutez pas en tant que root, configurez les écrans simillar, installez google-chrome, puis avec maven, vous pouvez lancer les tests Selenium. Mes tests se sont bien déroulés avec ces règles et opérations.

0
cyan

J'augmente la mémoire maximale pour démarrer node-chrome avec -Xmx3g, et c'est un travail pour moi

0
袁文涛

Je ne suis pas sûr que cela arrête tout le monde, mais j'ai résolu ce problème en mettant à niveau chromedriver, puis en veillant à ce qu'il se trouve dans un endroit où mon utilisateur peut lire (il semble que beaucoup de personnes qui le rencontrent le voient pour des raisons de permission, comme moi). .

Sous Ubuntu 16.04: 1. Téléchargez chromedriver (version 2.37 pour moi) 2. Décompressez le fichier 3. Installez-le dans un endroit logique (j'ai choisi/usr/local/bin/chromedriver)

N’a même pas besoin d’être la propriété de mon utilisateur tant qu’il est globalement exécutable (Sudo chmod +x /usr/local/bin/chromedriver)

0
Robert Townley

Exporter la variable DISPLAY est certainement la solution, mais selon votre configuration, vous devrez peut-être procéder de manière légèrement différente.

Dans mon cas, j'ai deux processus différents: le premier démarre Xvfb, le second lance les tests. Donc, ma connaissance des scripts Shell est un peu rouillée, mais j’ai bien compris que l’exportation de la variable DISPLAY du premier processus ne l’a pas rendue disponible dans le deuxième processus.

Heureusement, Selenium WebDriver vous permet de "redéfinir" votre environnement. C’est ma fonction qui permet de créer un pilote pour Chrome dans JS. Il est pratiquement certain que l’équivalent existe pour votre langage de programmation:

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