我正在尝试在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
遵循此link, chromedriver 29 是 chrome 34 的正确版本。无论如何,以前的版本因为glibc版本而无法在Debian 7上运行......
----------ChromeDriver v2.9 (2014-01-31)---------- Supports 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":"unknown error: Chrome failed to start: exited abnormally\n (Driver info: chromedriver=2.9.248316,platform=Linux 3.2.0-4-686-pae x86)"}}
任何帮助以了解正在发生的事情都将受到赞赏。
由于
答案 0 :(得分:57)
我终于设法让Selenium测试在我的笔记本电脑(服务器)上启动Chrome驱动程序。
重要的是使用Xvfb
。不要问我为什么,但是一旦你接受了这个事实,请遵循以下步骤(比@Anon回答更详细)
在Jenkins设置中添加全局属性
key : DISPLAY
value:0:0
在您的服务器上,在后台启动Xvfb
:
Xvfb :0 -ac -screen 0 1024x768x24 &
答案 1 :(得分:13)
您是否将DISPLAY参数传递给Jenkins作业?
我假设你也试图在无头模式下执行测试。因此,设置一些x服务(即Xvfb)并将DISPLAY号码传递给您的工作。为我工作。
答案 2 :(得分:9)
我试图使用wdio在Mocha框架上对Jenkins运行selenium。以下是解决此问题的步骤: -
安装Google Chrome
sudo apt-get update
sudo apt-get install google-chrome-stable
安装Chrome驱动程序
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
答案 3 :(得分:4)
Mike R的解决方案适合我。这是完整的命令集:
Xvfb :99 -ac -screen 0 1280x1024x24 &
export DISPLAY=:99
nice -n 10 x11vnc 2>&1 &
稍后您可以运行google-chrome:
google-chrome --no-sandbox &
或者通过selenium驱动程序启动谷歌浏览器(例如):
ng e2e --serve true --port 4200 --watch true
Protractor.conf文件:
capabilities: {
'browserName': 'chrome',
'chromeOptions': {
'args': ['no-sandbox']
}
},
答案 4 :(得分:3)
我们在尝试从Jenkins启动Selenium测试时遇到了同样的问题。我在构建之前选择了'启动Xvfb,并在'框后关闭它并传递了必要的屏幕选项,但我仍然收到此错误。
当我们在Execute Shell框中传入以下命令时,它终于奏效了。
Xvfb :99 -ac -screen 0 1280x1024x24 &
nice -n 10 x11vnc 2>&1 &
...
killall Xvfb
答案 5 :(得分:3)
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);
...
答案 6 :(得分:2)
将no-sandbox传递给exec对于前景窗口中的jenkins或作为服务似乎很重要。这是我的解决方案
chromedriver fails on windows jenkins slave running in foreground
答案 7 :(得分:1)
我正在运行类似的设置:Selenium 3.40,Chrome 61,chromedriver 2.33在ubuntu 16.04上使用xvfb运行。
我间歇性地收到了同样的Chrome错误。有时,chromedriver似乎无法清除与Chrome配置文件关联的临时文件。
对我来说,解决方法是在运行测试之前清理临时文件:
rm -rf /tmp/.org.chromium.Chromium*
我希望在将来的chromedriver版本中解决这个问题,但是现在这解决了我的问题。
答案 8 :(得分:1)
我已经和这个问题打了很长时间了,就在我今天弄清楚如何让它消失了今天我可以运行一个50线程进程调用selenium而不再看到这个问题而且还停止崩溃我的机器出现问题,过多的开放式镀铬过程。
这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);
}
}
}
}
祝你好运,我希望你不再看到崩溃问题了
请评论您的成功
致以最诚挚的问候,
答案 9 :(得分:1)
在Linux中,将这些行添加到我的代码中对我有帮助。
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")
答案 10 :(得分:0)
导出DISPLAY
变量绝对是解决方案,但根据您的设置,您可能需要以稍微不同的方式执行此操作。
就我而言,我有两个不同的过程:第一个启动Xvfb,另一个启动测试。所以我的shell脚本知识有点生疏,但我发现从第一个进程导出DISPLAY
变量并没有使它在第二个进程中可用。
幸运的是,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);
};
答案 11 :(得分:0)
我在x86 linux上使用maven测试时出现了simillar问题,我正在终端中使用它。 我是通过 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,它是虚拟屏幕缓冲区。重要的是,您应该以root身份运行测试,因为您可能会收到另一个Chrome浏览器错误。 所以没有root我运行:
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测试。这些规则和操作我的测试很顺利。
答案 12 :(得分:0)
不确定这是否会阻止其他所有人,但我通过升级chromedriver解决了这个问题,然后确保它位于我的用户可以阅读的地方(似乎很多人遇到此问题是出于许可原因而看到它像我一样。)
在Ubuntu 16.04上: 1.下载chromedriver(版本2.37对我来说) 2.解压缩文件 3.安装在合理的地方(我选择/ usr / local / bin / chromedriver)
我的用户甚至不需要拥有该用户,只要它可全局执行(sudo chmod +x /usr/local/bin/chromedriver
)
答案 13 :(得分:0)
我增加了最大内存,以-Xmx3g
来启动node-chrome,对我来说很有用
答案 14 :(得分:0)
您不需要Xvfb
由于chrome版本与chromedriver版本不匹配,因此无法启动。下载并安装相同版本或最新版本将解决此问题。