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 29とchrome 34.0.1847.76 betaを実行していますDebian 7 32ビット。私はSelenium-Java 2.33.0を使用しています
これに続いて リンク 、chromedriver 29はchrome 34。とにかく、以前のバージョンはglibcバージョンのためにDebian 7では動作しません…
---------- ChromeDriver v2.9(2014-01-31)---------- Chrome v31-34をサポート
[更新1]
私はJava 7とJava 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) "}}
何が起こっているかを知るための助けをいただければ幸いです。
ありがとう
ついにラップトップ(サーバー)でChromeドライバーを開始するSeleniumテストを取得できました。
重要なことは、Xvfb
を使用することです。理由を聞かないでください。この事実を受け入れたら、次の手順に従ってください(@Anonの回答よりも詳細)
Jenkinsの設定でグローバルプロパティを追加します
key : DISPLAY
value:0:0
サーバーでXvfb
をバックグラウンドで起動します。
Xvfb :0 -ac -screen 0 1024x768x24 &
JenkinsジョブにDISPLAYパラメーターを渡しますか?
あなたもテストをヘッドレスモードで実行しようとしていると思います。そのため、xサービス(Xvfbなど)をセットアップし、DISPLAY番号をジョブに渡します。私のために働いた。
私は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
マイク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']
}
},
JenkinsからSeleniumテストを起動しようとしたときに同じ問題が発生しました。 「ビルドの前にXvfbを開始し、その後シャットダウンする」ボックスを選択し、必要な画面オプションを渡しましたが、まだこのエラーが発生していました。
シェルの実行ボックスで次のコマンドを渡すと、ようやく機能しました。
Xvfb :99 -ac -screen 0 1280x1024x24 & Nice -n 10 x11vnc 2>&1 & ... killall Xvfb
サンドボックスをexecに渡すことは、フォアグラウンドまたはサービスとしてのウィンドウのジェンキンにとって重要と思われます。これが私の解決策です
私は長い間この問題と闘ってきましたが、今日はそれをなくす方法を見つけました。今日、この問題を見ることなくSeleniumを呼び出す50スレッドプロセスを実行でき、メモリ不足でマシンのクラッシュを止めることができます開いているchromedriverプロセスが多すぎる問題。
これらの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);
}
}
}
}
幸運を祈ります。もうクラッシュの問題が見られないことを願っています
あなたの成功をコメントしてください
宜しくお願いします、
同様のセットアップを実行しています。Selenium3.40、Chrome 61、ubuntu 16.04でxvfbを使用してchromedriver 2.33を実行しています。
同じChromeエラーが断続的に発生していました。クロムドライバがChromeプロファイルに関連付けられた一時ファイルのクリーンアップに失敗することがあるようです。
私の回避策は、テストを実行する前に一時ファイルをクリーンアップすることです。
rm -rf /tmp/.org.chromium.Chromium*
これは将来のバージョンのchromedriverで解決されると思いますが、今のところこれは私の場合の問題を解決します。
ターミナルで使用していた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テストを開始できます。私のテストはこれらのルールと操作でうまくいきました。
-Xmx3g
でnode-chromeを起動するために最大メモリを増やします。
これが他のすべての人を停止させているかどうかはわかりませんが、chromedriverをアップグレードして、ユーザーが読み取り可能な場所にあることを確認して解決しました(これに遭遇する多くの人が私のような許可の理由で見ているようです) 。
Ubuntu 16.04の場合:1. chromedriverをダウンロードします(バージョン2.37の場合)2.ファイルを解凍します3.適切な場所にインストールします(/ usr/local/bin/chromedriverを選択しました)
グローバルに実行可能である限り、ユーザーが所有する必要さえありません(Sudo chmod +x /usr/local/bin/chromedriver
)
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);
};