未知错误:Chrome无法启动:异常退出(驱动程序信息:chromedriver = 2.9

时间:2014-03-21 11:55:19

标签: selenium selenium-webdriver selenium-chromedriver

我正在尝试在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)"}}

任何帮助以了解正在发生的事情都将受到赞赏。

由于

15 个答案:

答案 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)

  1. 检查您是否使用ChromeDriver version that corresponds to your Chrome version
  2. 如果您在Linux without graphical interface "headless" mode must be used

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而不再看到这个问题而且还停止崩溃我的机器出现问题,过多的开放式镀铬过程。

  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. export DISPLAY:15来自.bashsh / .profile
  5. 这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版本不匹配,因此无法启动。下载并安装相同版本或最新版本将解决此问题。