Подтвердить что ты не робот

Неизвестная ошибка: Chrome не удалось запустить: анонимно вышел (информация о драйвере: chromedriver = 2.9

Я пытаюсь запустить тесты Selenium на Debian 7, но безуспешно.

Ошибка:

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​​strong > , работающим на Debian 7 32 бит. Я использую selenium-java 2.33.0

Следуя этой ссылке, chromedriver 29 является правильной версией для хром 34. И вообще, предыдущие версии не работают на Debian 7 из-за версии glibc...

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

Любая помощь, чтобы знать, что происходит, будет оценена.

Спасибо

4b9b3361

Ответ 1

Наконец-то мне удалось получить тесты Selenium, запускающие драйвер Chrome на моем ноутбуке (сервере).

Важным битом является использование Xvfb. Не спрашивайте меня, почему, но как только вы примете этот факт, выполните следующие шаги (более подробно, чем @Anon ответ)

  • В настройках Jenkins добавьте глобальное свойство

    key : DISPLAY
    value:0:0
    
  • На вашем сервере запустите Xvfb в фоновом режиме:

     Xvfb :0 -ac -screen 0 1024x768x24 &
    

Ответ 2

Передаете ли вы параметр DISPLAY вашей работе Jenkins?

Я предполагаю, что вы также пытаетесь выполнить тесты в режиме безглавых. Поэтому настройте некоторую службу x (т.е. Xvfb) и передайте номер DISPLAY вашей работе. Работал для меня.

Ответ 3

Я пытался запустить селен на Jenkins с каркасом Mocha, используя wdio. Ниже приведены шаги по решению этой проблемы: -

Установить google chrome

sudo apt-get update 

sudo apt-get install google-chrome-stable

Установить хром-драйвер

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

Выполнить следующие команды для запуска веб-сервера selenium

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

Ответ 4

Решение Mike R работает для меня. Это полный набор команд:

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

Позже вы можете запустить google-chrome:

google-chrome --no-sandbox &

Или запустите google chrome через драйвер selenium (например):

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

Файл Protractor.conf:

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

Ответ 6

У нас была такая же проблема, когда мы пытались запустить тесты Selenium от Jenkins. Я выбрал "Начать Xvfb перед сборкой и закрыл его после" и передал необходимые параметры экрана, но я все еще получал эту ошибку.

Он, наконец, работал, когда мы передали следующие команды в поле Execute Shell.

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

Ответ 7

Я запускаю аналогичную настройку: Selenium 3.40, Chrome 61, chromedriver 2.33 работает с xvfb на ubuntu 16.04.

Я получал одну и ту же ошибку Chrome с перерывами. Похоже, что иногда хромограф не может очистить временные файлы, связанные с профилем Chrome.

Обходной путь для меня - очистка файлов temp перед запуском тестов:

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

Я ожидаю, что это будет разрешено в будущих версиях chromedriver, но пока это решает проблему в моем случае.

Ответ 8

Я долгое время сражался с этой проблемой, и я просто понял, как это уйти, и сегодня я могу запустить процесс 50 потоков, назвав селен, не увидев эту проблему больше, и также перестаю рушиться машина с проблемой outofmemory с слишком большим количеством открытых процессов хромирования.

  • Я использую селен 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;
  • запуск открытого сеанса с экраном, чтобы мой сеанс никогда не умирал,
  • запуск Xvfb: nohup Xvfb -ac: 15-screen 0 1280x1024x16 &
  • export DISPLAY: 15 из .bashsh/.profile

эти 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

Экспорт переменной DISPLAY определенно является решением, но в зависимости от вашей настройки вам может понадобиться сделать это несколько иначе.

В моем случае у меня есть два разных процесса: первый запускает Xvfb, другой запускает тесты. Таким образом, мои знания сценариев оболочки немного ржавые, но я понял, что экспортирование переменной DISPLAY из первого процесса не делает его доступным во втором процессе.

К счастью, Selenium WebDriver позволяет вам "переопределять" вашу среду. Это моя функция для создания драйвера для Chrome в JS. Довольно точно, что эквивалент существует для вашего языка программирования:

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

Ответ 10

У меня была проблема simillar с maven-тестами на x86 linux, которые я использовал в терминале. Я входил в linux с помощью ssh. Я начал тесты на селезенку 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. Так что нет, как root я run:

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

Что важно здесь, что в моем случае число, связанное с DISPLAY, должно быть таким же, как и параметр Xvfb: NN. 99 в этом случае. У меня была другая проблема, потому что я запускал Xvfb с другим значением DISPLAY, и я хотел, чтобы он остановился. Чтобы перезапустить Xvfb:

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

Итак, найдите PID процесса с grep. Убейте процесс Xvfb. А затем в /tmp/.X11-unix/XNN есть блокировка, поэтому удалите эту блокировку, и вы можете снова запустить сервер. Если вы запускаете не как root, установите simillar-дисплеи, установите google-chrome, а затем с maven вы можете начать тесты селена. Мои тесты прошли отлично с этими правилами и операциями.

Ответ 11

Не уверен, что это останавливает всех остальных, но я решил эту проблему, обновив chromedriver, а затем убедившись, что он находится в месте, откуда мой пользователь может читать (кажется, что многие люди, сталкивающиеся с этим, видят это по причинам разрешения, таким как я),

В Ubuntu 16.04: 1. Скачайте chromedriver (для меня версия 2.37) 2. Разархивируйте файл 3. Установите его где-нибудь разумно (я выбрал /usr/local/bin/chromedriver)

Даже не должен принадлежать моему пользователю, если он исполняется глобально (sudo chmod +x/usr/local/bin/chromedriver)