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


76

我试图在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

我有在Debian 7 32位上运行的带有chrome 34.0.1847.76 beta的chromedriver 29。我正在使用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“内容类型:application / json; charset = utf-8” -d“ {\” desiredCapabilities \“:{\” platform \“:\” ANY \“,\” browserName \“: \“ chrome \”,\“ chromeOptions \”:{\“ args \”:[],\“扩展名\”:[]},\“版本\”:\“ \”,\“ chrome.switches \” :[]}}“ localhost:12495 / session

我收到相同的错误消息:

{“ sessionId”:“ 210f3f837a798ee68cd91f089976d0c2”,“状态”:13,“值”:{“消息”:“未知错误:Chrome无法启动:异常退出\ n(驱动程序信息:chromedriver = 2.9.248316,platform = Linux 3.2.0-4-686-pae x86)“}}

任何知道正在发生什么的帮助将不胜感激。

谢谢


任何人都可以在詹金斯号上以非无头模式运行
SaiPawan,

Answers:


61

我终于设法通过笔记本电脑(服务器)上的Chrome驱动程序进行了Selenium测试。

重要的是要使用Xvfb。不要问我为什么,但是一旦您接受了这个事实,请按照以下步骤操作(比@Anon回答更详细)

  • 在您的詹金斯设置中添加全局属性

    key : DISPLAY
    value:0:0
    
  • 在服务器上从Xvfb后台启动:

     Xvfb :0 -ac -screen 0 1024x768x24 &
    

1
XX其中XX是显示解决了数probllem我:增加出口显示器=
米哈尔Ignaszewski

1
谢谢您的帮助!另外,还有一条对我有帮助的说明:通过“ Manage Jenkins->配置系统->全局属性”完成设置全局变量
Robert Townley

应该是value:0:0还是value: :0
dps

1
Xvfb提供了虚拟显示,可将浏览器呈现到该显示上。可能以无头模式运行测试还可以减轻渲染呈现硒的浏览器的需求,否则硒会生成到虚拟显示器上。
狮子座

14

您是否正在将DISPLAY参数传递给Jenkins工作?

我假设您也尝试以无头模式执行测试。因此,设置一些x服务(即Xvfb)并将DISPLAY号传递给您的工作。为我工作。


我没有尝试在无头模式下执行测试,因为我使用的是笔记本电脑,并且即使关闭盖子也可以将屏幕设置为保持打开状态。但是,也许我应该在无头模式下尝试?
redochka 2014年

在无头服务器上出现此问题,请确保正确设置了DISPLAY,以解决我的问题!谢谢!
sbditto85 2014年

10

我试图使用wdio在Mocha框架上的Jenkins上运行硒。因此,以下是解决此问题的步骤:-

安装谷歌浏览器

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

5

Mike R的解决方案对我有用。这是完整的命令集:

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

稍后您可以运行google-chrome:

google-chrome --no-sandbox &

或通过硒驱动程序启动谷歌浏览器(例如):

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

Protractor.conf文件:

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

xvfb是一个虚拟屏幕,如果您仅使用终端,它会有所帮助:en.wikipedia.org/wiki/Xvfb
changtung

1
“以某种方式”是因为浏览器是图形应用程序,需要使用显示器来呈现任何内容
Corey Goldberg,

3

对于前台或服务中的Windows詹金斯来说,将无沙箱传递给exec似乎很重要。这是我的解决方案

在前台运行的Windows Jenkins从属设备上chromedriver失败


我曾经no-sandbox 在无头模式下在docker容器中使用chrome时使用过(selenium-webdriver 3和Ruby on Rails)。
dps

除非您使用root来运行它,否则它不起作用,--no-sandbox并且许多Docker容器都以root身份运行它,并且某些(严格配置的)Jenkins节点也可能使用root。您可以添加的另一个选项可以--headless帮助您完全避免使用Xvfb。您可能还需要--disable-dev-shm-usage专门在Docker中使用,或者需要在运行中绑定安装该设备--mount type=bind,source=/dev/shm,target=/dev/shm
dragon788 '19

3

尝试从Jenkins启动Selenium测试时,我们遇到了同样的问题。我选择了“在构建之前启动Xvfb,并在构建之后将其关闭”框并传递了必要的屏幕选项,但是仍然出现此错误。

当我们在“执行外壳”框中传递以下命令时,它终于起作用了。

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


您能以非无头模式运行吗
SaiPawan

谢谢,第一行为我修复了chrome驱动程序脚本:)
Chris G

3
  1. 检查您使用的ChromeDriver版本是否与您的Chrome版本相对应
  2. 如果您在Linux上没有图形界面,则必须使用“无头”模式

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

1

我正在运行类似的设置:Selenium 3.40,Chrome 61,chromedriver 2.33和ubuntu 16.04上的xvfb一起运行。

我间歇性地收到相同的Chrome错误。似乎chromedriver有时无法清除与Chrome配置文件关联的临时文件。

对我来说,一种解决方法是在运行测试之前清理临时文件:

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

我希望在chromedriver的未来版本中能够解决此问题,但就目前而言,这可以解决我的问题。


1

我一直在与这个问题作斗争很长时间,就在今天,我想出了解决办法,今天,我可以运行一个调用selenium的50线程进程,而不再看到此问题,并且也不会因为内存不足而使我的机器崩溃开放式chromedriver进程过多的问题。

  1. 我正在使用硒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

在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")

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

您可以在当前shell上下文环境(stackoverflow.com/questions/16618071/…)中执行xvfb启动脚本:xvfb.sh
Milso

0

我在终端中使用的x86 linux上的maven测试有类似问题。我是通过ssh登录到linux的。我通过以下方式开始了Java硒测试

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浏览器错误。所以没有我作为根运行:

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启动硒测试。这些规则和操作对我的测试进行得很好。


0

不知道这是否会阻止其他所有人,但是我通过升级chromedriver然后确保它位于我的用户可以阅读的地方来解决此问题(似乎很多人遇到此问题都是出于我这样的权限原因而看到它) 。

在Ubuntu 16.04上:1.下载chromedriver(对我而言是2.37版)2.解压缩文件3.将其安装在合理的位置(我选择了/ usr / local / bin / chromedriver)

只要它是全局可执行文件(sudo chmod +x /usr/local/bin/chromedriver),甚至都不必由我的用户拥有


0

我增加了最大内存以使用来启动node-chrome -Xmx3g,这对我来说很有效


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.