web-dev-qa-db-ja.com

不明なエラー:Chromeの起動に失敗しました:異常終了しました(ドライバー情報:chromedriver = 2.9

Debian 7でSeleniumテストを実行しようとしていますが、成功していません。

エラーは次のとおりです。

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

私はchromedriver 29chrome 34.0.1847.76 betaを実行していますDebian 7 32ビット。私はSelenium-Java 2.33.0を使用しています

これに続いて リンクchromedriver 29chrome 34。とにかく、以前のバージョンはglibcバージョンのためにDebian 7では動作しません…

 ---------- ChromeDriver v2.9(2014-01-31)---------- 
 Chrome v31-34をサポート

[更新1]

私はJava 7Java 6の両方で試しましたが、まだ同じです問題。 Java 8で試すべきかもしれません^^

[更新2]

このコマンドを使用してchromeドライバーをテストし、jenkinsの問題ではないことを確認します。

 curl -X POST -H "Content-Type:application/json; charset = utf-8" -d "{\" desiredCapabilities\":{\" platform\":\" ANY\"、\" browserName\":\" chrome\"、\" chromeOptions\":{\" args\":[]、\" extensions\":[]}、\" version\":\"\"、\" chrome.switches\":[]}}" localhost:12495/session 

同じエラーメッセージが表示されます。

 {"sessionId": "210f3f837a798ee68cd91f089976d0c2"、 "status":13、 "value":{"message": "不明なエラー:Chromeの開始に失敗しました:異常終了しました\ n(ドライバー情報: chromedriver = 2.9.248316、platform = Linux 3.2.0-4-686-pae x86) "}} 

何が起こっているかを知るための助けをいただければ幸いです。

ありがとう

73
redochka

ついにラップトップ(サーバー)でChromeドライバーを開始するSeleniumテストを取得できました。

重要なことは、Xvfbを使用することです。理由を聞かないでください。この事実を受け入れたら、次の手順に従ってください(@Anonの回答よりも詳細)

  • Jenkinsの設定でグローバルプロパティを追加します

    key : DISPLAY
    value:0:0
    
  • サーバーでXvfbをバックグラウンドで起動します。

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

JenkinsジョブにDISPLAYパラメーターを渡しますか?

あなたもテストをヘッドレスモードで実行しようとしていると思います。そのため、xサービス(Xvfbなど)をセットアップし、DISPLAY番号をジョブに渡します。私のために働いた。

13
Anon

私はwdioを使用してMochaフレームワークでJenkinsでSeleniumを実行しようとしていました。この問題を解決する手順は次のとおりです。

google chromeのインストール

Sudo apt-get update 

Sudo apt-get install google-chrome-stable

chrome-driverのインストール

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

次のコマンドを実行してSelenium Webサーバーを起動します

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"

この開始後、wdioコマンドでテストします

wdio wdio.conf.js
9
Harkirat Saluja

マイクRのソリューションは私に適しています。これはコマンドの完全なセットです:

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

後でgoogle-chromeを実行できます:

google-chrome --no-sandbox &

または、Seleniumドライバーを介してGoogle chromeを起動します(例):

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

Protractor.confファイル:

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

JenkinsからSeleniumテストを起動しようとしたときに同じ問題が発生しました。 「ビルドの前にXvfbを開始し、その後シャットダウンする」ボックスを選択し、必要な画面オプションを渡しましたが、まだこのエラーが発生していました。

シェルの実行ボックスで次のコマンドを渡すと、ようやく機能しました。

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

3
Mike R

サンドボックスをexecに渡すことは、フォアグラウンドまたはサービスとしてのウィンドウのジェンキンにとって重要と思われます。これが私の解決策です

chromedriverは、フォアグラウンドで実行されているWindows jenkinsスレーブで失敗します

2
Peter Kahn

私は長い間この問題と闘ってきましたが、今日はそれをなくす方法を見つけました。今日、この問題を見ることなくSeleniumを呼び出す50スレッドプロセスを実行でき、メモリ不足でマシンのクラッシュを止めることができます開いているchromedriverプロセスが多すぎる問題。

  1. Selenium 3.7.1、chromedrive 2.33、Java.version: '1.8.0'、redhat ver '3.10.0-693.5.2.el7.x86_64'、chromeブラウザバージョン:60.0.3112.90を使用しています;
  2. 画面で開かれたセッションを実行し、私のセッションが決して死なないようにします。
  3. xvfbの実行:Nohup Xvfb -ac:15 -screen 0 1280x1024x16&
  4. .bashsh/.profileからDISPLAY:15をエクスポート

これらの4つの項目は、誰もが既に知っている基本設定であり、今ではコードが登場し、成功を収めるためにすべてが大きな違いをもたらしました。

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

}

幸運を祈ります。もうクラッシュの問題が見られないことを願っています

あなたの成功をコメントしてください

宜しくお願いします、

1
Wilson

同様のセットアップを実行しています。Selenium3.40、Chrome 61、ubuntu 16.04でxvfbを使用してchromedriver 2.33を実行しています。

同じChromeエラーが断続的に発生していました。クロムドライバがChromeプロファイルに関連付けられた一時ファイルのクリーンアップに失敗することがあるようです。

私の回避策は、テストを実行する前に一時ファイルをクリーンアップすることです。

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

これは将来のバージョンのchromedriverで解決されると思いますが、今のところこれは私の場合の問題を解決します。

1
Andrew Johnston

ターミナルで使用していたx86 linuxでのMavenテストで同様の問題が発生しました。 sshでLinuxにログインしていました。 Java Seleniumテストを開始しました

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

私のアプリを除いて、これらのテストを実行した後、ログにエラーを受け取りました:

unknown error: Chrome failed to start: exited abnormally

私はこれらのテストをrootユーザーとして実行していました。このエラーの前に、ChromeDriverが存在しないことを受け取りました。 ChromeDriverバイナリをインストールしてPATHに追加することで、これを進めました。しかし、その後google-chromeブラウザーをインストールする必要がありました-ChromeDriverだけではテストを実行するのに十分ではありません。そのため、端末ウィンドウの画面バッファに問題があるかもしれませんが、仮想画面バッファであるXvfbをインストールできます。重要なことは、別のChromeブラウザエラーを受け取る可能性があるため、ルートとしてではなくテストを実行する必要があることです。だからルートとして私は実行します:

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

ここで重要なことは、私の場合、DISPLAYに関連する数値はXvfb:NNパラメーターと同じでなければならないということです。その場合は99。別のDISPLAY値を使用してXvfbを実行し、停止したかったため、別の問題が発生しました。 Xvfbを再起動するには:

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

そのため、grepでプロセスPIDを見つけます。 Xvfbプロセスを強制終了します。そして/tmp/.X11-unix/XNNにロックがあるので、このロックを削除すると、サーバーを再起動できます。 root以外で実行する場合は、simillarディスプレイを設定し、google-chromeをインストールしてから、mavenを使用してSeleniumテストを開始できます。私のテストはこれらのルールと操作でうまくいきました。

0
cyan

-Xmx3gでnode-chromeを起動するために最大メモリを増やします。

0
袁文涛

これが他のすべての人を停止させているかどうかはわかりませんが、chromedriverをアップグレードして、ユーザーが読み取り可能な場所にあることを確認して解決しました(これに遭遇する多くの人が私のような許可の理由で見ているようです) 。

Ubuntu 16.04の場合:1. chromedriverをダウンロードします(バージョン2.37の場合)2.ファイルを解凍します3.適切な場所にインストールします(/ usr/local/bin/chromedriverを選択しました)

グローバルに実行可能である限り、ユーザーが所有する必要さえありません(Sudo chmod +x /usr/local/bin/chromedriver

0
Robert Townley

DISPLAY変数をエクスポートすることは間違いなく解決策ですが、設定によっては少し異なる方法でこれを行う必要がある場合があります。

私の場合、2つの異なるプロセスがあります。1つはXvfbを起動し、もう1つはテストを起動します。したがって、私のシェルスクリプトの知識は少し錆びていますが、最初のプロセスからDISPLAY変数をエクスポートしても、2番目のプロセスで使用可能にならないことがわかりました。

幸いなことに、Selenium WebDriverを使用すると、環境を「再定義」できます。これは、JSでChromeのドライバーを作成するための私の機能です。プログラミング言語に相当するものが存在することを確認してください:

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