WebDriverException: неизвестная ошибка: файл DevToolsActivePort не существует при попытке запуска браузера Chrome


154

Я пытаюсь запустить Chrome с URL, браузер запускается, и после этого ничего не происходит.

Я вижу ошибку ниже через 1 минуту:

Unable to open browser with url: 'https://www.google.com' (Root cause: org.openqa.selenium.WebDriverException: unknown error: DevToolsActivePort file doesn't exist
  (Driver info: chromedriver=2.39.562718 (9a2698cba08cf5a471a29d30c8b3e12becabb0e9),platform=Windows NT 10.0.15063 x86_64) (WARNING: The server did not provide any stacktrace information)

Моя конфигурация:

  • Хром: 66
  • ChromeBrowser: 2.39.56

PS все отлично работает в Firefox


1
Можете ли вы обновить вопрос с помощью кода, который вызывает эту ошибку?
GPT14

Я получил эту ошибку, когда произошел сбой vncserver, и у меня больше не было дисплея X
xtian

Ответы:


71

Это сообщение об ошибке ...

org.openqa.selenium.WebDriverException: unknown error: DevToolsActivePort file doesn't exist 

... подразумевает, что ChromeDriver не смог инициировать / создать новый WebBrowser, т.е. сеанс браузера Chrome .

Ваши испытания кода и информация о версиях всех двоичных файлов дала бы нам подсказку о том, что происходит не так.

Однако в соответствии с параметром « Добавить --disable-dev-shm-Использование к флагам запуска по умолчанию» добавление аргумента --disable-dev-shm-usageвременно решит проблему.

Если вы хотите инициировать / охватить новый сеанс браузера Chrome, вы можете использовать следующее решение:

System.setProperty("webdriver.chrome.driver", "C:\\path\\to\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("start-maximized"); // open Browser in maximized mode
options.addArguments("disable-infobars"); // disabling infobars
options.addArguments("--disable-extensions"); // disabling extensions
options.addArguments("--disable-gpu"); // applicable to windows os only
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("--no-sandbox"); // Bypass OS security model
WebDriver driver = new ChromeDriver(options);
driver.get("https://google.com");

Disable-DEV-ое-использование

Согласно base_switches.cc disable-dev-shm-usage кажется действительным только на ОС Linux :

#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
// The /dev/shm partition is too small in certain VM environments, causing
// Chrome to fail or crash (see http://crbug.com/715363). Use this flag to
// work-around this issue (a temporary directory will always be used to create
// anonymous shared memory files).
const char kDisableDevShmUsage[] = "disable-dev-shm-usage";
#endif

В обсуждении Добавить параметр, чтобы использовать / tmp вместо / dev / shm, Дэвид упоминает:

Я думаю, это будет зависеть от того, как смонтированы / dev / shm и / tmp. Если они оба смонтированы как tmpfs, я предполагаю, что не будет никакой разницы. если по какой-либо причине / tmp не отображается как tmpfs (и я думаю, что по умолчанию systemd отображает как tmpfs), управление общей памятью chrome всегда отображает файлы в память при создании анонимных общих файлов, поэтому даже в этом случае не должно быть большая разница Я полагаю, вы могли бы принудительно запустить тесты телеметрии с включенным флагом и посмотреть, как он работает.

Что касается того, почему не использовать по умолчанию, команда общей памяти отодвинула назад, я думаю, что имеет смысл использовать / dev / shm для общей памяти по умолчанию.

В конечном итоге все это должно перейти на использование memfd_create, но я не думаю, что это произойдет в ближайшее время, поскольку это потребует значительного рефакторинга управления памятью Chrome.


Outro

Вот ссылка на историю Песочницы .


8
Но чем вызвана эта конкретная ошибка DevToolsActivePort file doesn't exist, и почему она вдруг начала появляться?

3
Элементы «Дополнительное рассмотрение» - они выглядят так, как будто они вполне применимы к этой проблеме. Особенно в такой ситуации, когда точно не установлено, что вызвало проблему.
Пит Келли

5
Из удаленной части сообщения @ DebanjanB это может быть вызвано использованием Chromedriver, который не поддерживает версию установленного Chrome. Это может произойти, например, если Chrome обновлен без обновления Chromedriver.
expz

Раньше это решало проблему для меня, но не в моей нынешней системе (Ubuntu 18 + Python 3.7)
tw0000

3
В случае, если это поможет кому-то еще, просто добавления disable-dev-shm-usageбыло недостаточно. Я должен был также добавить, --no-sandboxчтобы заставить это работать. Это было полное исправление для меня для Selenium-java:chromeOptions.addArguments("--no-sandbox", "--disable-dev-shm-usage");
Джордж Пантазес

52

Я начал видеть эту проблему в понедельник 2018-06-04. Наши тесты проводятся каждый будний день. Похоже, что единственное, что изменилось, это версия google-chrome (которая была обновлена ​​до текущей версии), JVM и Selenium были последними версиями для Linux (Java 1.8.0_151, selenium 3.12.0, google-chrome 67.0.3396.62 и Xvfb перспектива).
В частности, добавление аргументов « --no-sandbox » и « --disable-dev-shm-Использование » остановило ошибку. Я рассмотрю эти вопросы, чтобы найти больше информации об эффекте и другие вопросы, например, что вызвало обновление Google-Chrome.

ChromeOptions options = new ChromeOptions();
        ...
        options.addArguments("--no-sandbox");
        options.addArguments("--disable-dev-shm-usage");

Я хочу уточнить, что этот код выполнялся каждый будний день на компьютере с Ubuntu Linux, но эквивалентный код на рабочем столе Windows работал нормально даже в понедельник. Я не нашел информации о том, для чего предназначена функциональность файла DevToolsActivePort, и это тоже было бы полезно. ПК
Пит Келли

1
Эти опции остановили ошибку и для меня. pd: использование стека Rails.
Марио Перес

Я все еще получаю [java] [1536892035.965][SEVERE]: Timed out receiving message from renderer: 60.000ошибки даже с этим
Джонатан

@ Джонатан - Привет! Можете ли вы предоставить более подробную информацию, например, какую ОС, какие версии компонентов вы используете или как вы вызываете процесс?
Пит Келли

@Toby: Привет! Я не хотел подразумевать, что позиция имела значение, только минимальное использование этих параметров. Казалось, что некоторые значения по умолчанию, на которые я опирался, были изменены при обновлении. Любые другие сведения о вашей системе или сообщении, которое вы предоставляете, могут помочь.
Пит Келли

35

У нас были те же проблемы с нашими рабами jenkins (машина linux) и мы испробовали все варианты, описанные выше.

Помогла только установка аргумента

chrome_options.add_argument('--headless')

Но когда мы продолжили исследование, заметили, что экран XVFB не запускает свойства, и это вызывает эту ошибку. После того, как мы исправили экран XVFB, он решил проблему.


2
это решило мою проблему при запуске с использованием C # (в этом случае опция выглядела так: options.AddArgument ("- headless");
ozz

XVFB был проблемой для меня
lucaswxp

23

У меня была такая же проблема в питоне. Вышеуказанное помогло. Вот что я использовал в python -

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('/path/to/your_chrome_driver_dir/chromedriver',chrome_options=chrome_options)

Я решил свою проблему с обновлением Chrome (у меня уже была последняя версия chromedrive), поэтому мне пришлось обновить и обычный браузер.
axel_ande

19

Обновить:

Я могу решить эту проблему, и теперь я могу получить доступ к Chrome с нужным URL.

Результаты опробования предоставленных решений:

Я перепробовал все настройки, как указано выше, но мне не удалось решить проблему

Объяснение по поводу проблемы:

По моим наблюдениям файл DevToolsActivePort не существует, это вызвано тем, что chrome не может найти свою ссылку в папке scoped_dirXXXXX.

Шаги, предпринятые для решения проблемы

  1. Я убил все процессы Chrome и процессы драйвера Chrome.
  2. Добавлен код ниже, чтобы вызвать Chrome

    System.setProperty("webdriver.chrome.driver","pathto\\chromedriver.exe");    
    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("useAutomationExtension", false);
    WebDriver driver = new ChromeDriver(options);
    driver.get(url);
    

Используя описанные выше шаги, я смог решить проблему.

Спасибо за ваши ответы.


3
Знаете ли вы, что влияет на использование AutomationExtension? Это отключает расширения для автоматизации (скриншоты / контроль и т. Д.) Нет? Не должно ли появление DevTools сделать это изменение безрезультатным? codereview.chromium.org/2785413002
Тоби

11

Недавно я столкнулся с той же проблемой, и после некоторых проб и ошибок это сработало и для меня.

ДОЛЖЕН БЫТЬ НА ВЕРХЕ:

options.addArguments("--no-sandbox"); //has to be the very first option

BaseSeleniumTests.java

public abstract class BaseSeleniumTests {

    private static final String CHROMEDRIVER_EXE = "chromedriver.exe";
    private static final String IEDRIVER_EXE = "IEDriverServer.exe";
    private static final String FFDRIVER_EXE = "geckodriver.exe";
    protected WebDriver driver;

    @Before
    public void setUp() {
        loadChromeDriver();
    }

    @After
    public void tearDown() {
        if (driver != null) {
            driver.close();
            driver.quit();
        }
    }

    private void loadChromeDriver() {
        ClassLoader classLoader = getClass().getClassLoader();
        String filePath = classLoader.getResource(CHROMEDRIVER_EXE).getFile();
        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
        ChromeDriverService service = new ChromeDriverService.Builder()
                .usingDriverExecutable(new File(filePath))
                .build();
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--no-sandbox"); // Bypass OS security model, MUST BE THE VERY FIRST OPTION
        options.addArguments("--headless");
        options.setExperimentalOption("useAutomationExtension", false);
        options.addArguments("start-maximized"); // open Browser in maximized mode
        options.addArguments("disable-infobars"); // disabling infobars
        options.addArguments("--disable-extensions"); // disabling extensions
        options.addArguments("--disable-gpu"); // applicable to windows os only
        options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
        options.merge(capabilities);
        this.driver = new ChromeDriver(service, options);
    }

}

GoogleSearchPageTraditionalSeleniumTests.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class GoogleSearchPageTraditionalSeleniumTests extends BaseSeleniumTests {

    @Test
    public void getSearchPage() {
        this.driver.get("https://www.google.com");
        WebElement element = this.driver.findElement(By.name("q"));
        assertNotNull(element);
    }

}

pom.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <scope>test</scope>
        </dependency>
</dependencies>

Интересный ! Как вы генерируете .side файл? Это что-то, что человек QA делает вручную?
Нитал

Вы используете Selenium IDE для записи теста. В результате получается файл .side. Он работает нормально с помощью IDE, но я пытаюсь запустить его с помощью селен-сайд-раннера, но сталкиваюсь со всеми видами проблем с chromedriver.
Пабрамс

должен быть первый вариант - потратить несколько дней, чтобы найти этого ха-ха
cuniculus

Спасибо! Добавление "--no-sandbox" решит мою проблему.
Матабарес

7

В моем случае в следующей среде:

  • Windows 10
  • питон 3.7.5
  • Google Chrome версии 80 и соответствующий ChromeDriver в пути C:\Windows
  • селен 3.141.0

Мне нужно было добавить аргументы --no-sandboxи --remote-debugging-port=9222к ChromeOptionsобъекту и запустить код от имени администратора, запустив Powershell / cmd от имени администратора.

Вот соответствующий фрагмент кода:

options = webdriver.ChromeOptions()
options.add_argument('headless')
options.add_argument('--disable-infobars')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--no-sandbox')
options.add_argument('--remote-debugging-port=9222')
driver = webdriver.Chrome(options=options)

1
то же самое для меня с докером с Ubuntu 18.04, py3.7, chrome (драйвер) 80
patroqueeet

Это работало для меня без дальнейших проблем. Я только начал сталкиваться с этой проблемой сегодня, но из-за вашего ответа она быстро исправлена! Моя среда, по сути, такая же, как ваша.
Райан Харрис

6

Я столкнулся с этой проблемой на Ubuntu 20 с Python Selenium после того, как сначала загрузил хром-драйвер отдельно, а затем использовал sudo apt install chromium-browserДаже несмотря на то, что они были одной и той же версии, это продолжалось.

Мое исправление состояло в том, чтобы использовать предоставленный драйвер chrome, который шел с пакетом репозитория, расположенным в

/snap/bin/chromium.chromedriver

driver = webdriver.Chrome(chrome_options=options, executable_path='/snap/bin/chromium.chromedriver')

4

Как указано в этом другом ответе :

Это сообщение об ошибке ... означает, что ChromeDriver не смог инициировать / создать новый WebBrowser, то есть сеанс браузера Chrome.

Среди возможных причин, я хотел бы отметить тот факт , что, в случае , если вы работаете в обезглавленное Chromium через Xvfb, вы , возможно , необходимо exportв DISPLAYпеременной: в моем случае, я был на месте (как рекомендуется) --disable-dev-shm-usageи --no-sandboxварианты, все было работает нормально, но в новой установке, работающей на последней (на момент написания) версии Ubuntu 18.04, эта ошибка начала возникать, и единственное возможное исправление было выполнить export DISPLAY=":20"(предварительно запустив Xvfb с Xvfb :20&).


OMG Спасибо. Я внес несколько изменений в наш докер-контейнер и случайно пропустил xvfb. Я бы никогда не нашел этого, если бы ты не оставил это здесь :-).
Райан Шиллингтон

3

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

  • Google Chrome Версия 71.0
  • ChromeDriver версия 2.45
  • CentOS7 версия 1.153

У меня работал пользователь без полномочий root, у меня была правильная версия драйвера Chrome для Chromium.
TicJit

2

В моем случае это произошло, когда я попытался использовать свой профиль пользователя по умолчанию:

...
options.addArguments("user-data-dir=D:\\MyHomeDirectory\\Google\\Chrome\\User Data");
...

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

Решение: убейте все процессы chrome.exe, работающие в фоновом режиме.


У меня была похожая проблема, но в Linux - мои процессы chrome не были должным образом завершены после сбоя скрипта, и они использовались неправильно. убийство их решило проблему
jeremycg

2

обновить возможности в conf.js как

exports.config = {
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['todo-spec.js'],
  capabilities: {
    browserName: 'chrome',
    chromeOptions: {
      args: ['--disable-gpu', '--no-sandbox', '--disable-extensions', '--disable-dev-shm-usage']
    }
  },

};

2

В моем случае я пытался создать исполняемый файл jar в ОС Windows с браузером Chrome и хочу запустить его в автономном режиме в Unix-боксе с CentOs на нем. И я указывал свой двоичный файл на драйвер, который я скачал и упаковал с моим набором. Для меня эта проблема продолжает возникать независимо от добавления ниже:

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--no-sandbox");
System.setProperty("webdriver.chrome.args", "--disable-logging");
System.setProperty("webdriver.chrome.silentOutput", "true");
options.setBinary("/pointing/downloaded/driver/path/in/automationsuite");
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("disable-infobars"); // disabling infobars
options.addArguments("--disable-extensions"); // disabling extensions
options.addArguments("--disable-gpu"); // applicable to windows os only
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("window-size=1024,768"); // Bypass OS security model
options.addArguments("--log-level=3"); // set log level
options.addArguments("--silent");//
options.setCapability("chrome.verbose", false); //disable logging
driver = new ChromeDriver(options);

Решение, которое я пробовал и работало для меня, это загрузить Chrome и его инструменты на хост-машину VM / Unix, установить и указать двоичный файл на это в пакете автоматизации и бинго! Оно работает :)

Скачать команду:

wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm

Установить команду:

sudo yum install -y ./google-chrome-stable_current_*.rpm

Обновите пакет с бинарным путем google-chrome:

options.setBinary("/opt/google/chrome/google-chrome");

И .. это работает!


Куда мы добавим этот код? Я не вижу кода C # в моем файле
.side

1

У меня была такая же проблема, но в моем случае Chrome ранее был установлен в пользовательскую временную папку, после чего был переустановлен в Program files. Таким образом, любое из представленных здесь решений не помогло мне. Но если указать путь к chrome.exe, все работает:

chromeOptions.setBinary("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");

Надеюсь это кому-нибудь поможет =)


Кажется, полная противоположность исправления @shiuu ниже
Тоби

1

Никакое решение не сработало для моего. Но вот обходной путь:

maxcounter=5
for counter in range(maxcounter):
    try:           
        driver = webdriver.Chrome(chrome_options=options,
                          service_log_path=logfile,
                          service_args=["--verbose", "--log-path=%s" % logfile])
        break
    except WebDriverException as e:
        print("RETRYING INITIALIZATION OF WEBDRIVER! Error: %s" % str(e))
        time.sleep(10)
        if counter==maxcounter-1:
            raise WebDriverException("Maximum number of selenium-firefox-webdriver-retries exceeded.")

1

Вы можете получить эту ошибку просто для передачи неверных аргументов в Chrome. Например, если я "headless"передам в качестве аргумента C # ChromeDriver, он срабатывает великолепно. Если я ошибаюсь и использую неправильный синтаксис "--headless", я получаю DevToolsActivePort file doesn't existошибку.


1

Я столкнулся с той же проблемой, я использую UBUNTU, PYTHON и браузер OPERA . В моем случае проблема возникла из-за устаревшей версии Operadriver.

Решение: 1. Убедитесь, что вы установили последнюю версию браузера Opera (не используйте Opera beta или Opera Developer), для этого перейдите на официальный сайт Opera и загрузите оттуда последнюю версию opera_stable.

  1. Установите последнюю версию драйвера оперы (если у вас уже установлен драйвер оперы, вы должны сначала удалить его, используя sudo rm ...)

wget https://github.com/operasoftware/operachromiumdriver/releases/download/v.80.0.3987.100/operadriver_linux64.zip

   unzip operadriver_linux64.zip
   sudo mv operadriver /usr/bin/operadriver
   sudo chown root:root /usr/bin/operadriver
   sudo chmod +x /usr/bin/operadriver

в моем случае последний был 80.0.3987, как вы можете видеть

  1. Кроме того, я также установил chromedriver (но, поскольку я сделал это перед тестированием, я не знаю, нужно ли это), чтобы установить chromedriver, выполните шаги, описанные в предыдущем шаге: v

  2. Наслаждайся и благодари меня!

Пример кода селена

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Opera()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.quit()

0

Кажется, есть много возможных причин этой ошибки. В нашем случае ошибка произошла из-за следующих двух строк в коде:

System.setProperty("webdriver.chrome.driver", chromeDriverPath);
chromeOptions.setBinary(chromeDriverPath);

Это решается удалением второй строки.


Кажется, полная противоположность @ sergiy-konoplyaniy исправить выше: '(
Тоби

В нашем setBinary мы попытались установить драйвер chrome, что кажется ошибкой. Исправление @ sergiy-konoplyaniy устанавливает chrome.exe через setBinary.
shiuu

Где у вас был этот код? Все, что у меня есть, это файл .side, и в нем нет кода C #.
Пабрамс

0

Я столкнулся с той же проблемой при запуске Chrome через Behat / Mink и Selenium в контейнере Docker. После некоторой тряски я пришел к следующему, behat.ymlкоторое снабжает переключатели, упомянутые выше. Обратите внимание, что все они были необходимы для успешного запуска.

default:
    extensions:
        Behat\MinkExtension:
            base_url: https://my.app/
            default_session: selenium2
            selenium2:
                browser: chrome
                capabilities:
                    extra_capabilities:
                        chromeOptions:
                            args:
                                - "headless"
                                - "no-sandbox"
                                - "disable-dev-shm-usage"

0

В моем случае я нахожусь в среде Kubernetes, где я не могу использовать TMPDIR по умолчанию, потому что он заполнит временный каталог мусором.

Так что я использовал это, чтобы использовать другой tmpdir:

driver = new ChromeDriver(new ChromeDriverService.Builder()
                    .withEnvironment(ImmutableMap.of("TMPDIR", customTmpPath))
                    .build(), options);

Но теперь, когда я обновил все до последней версии, это больше не работает. Мне нужно будет найти новый способ сделать это.


0

Это происходит, когда chromedriver не может определить, какой порт отладки использует Chrome.

Одной из возможных причин является открытый дефект с HKEY_CURRENT_USER \ Software \ Policies \ Google \ Chrome \ UserDataDir

Но в моем последнем случае это была другая неопознанная причина.

К счастью, установка номера порта работала вручную:

final String[] args = { "--remote-debugging-port=9222" };
options.addArguments(args);
WebDriver driver = new ChromeDriver(options);

2
Это постоянный порт? Или где это можно посмотреть?
Майк Шиян

0

Неверный номер порта в моем случае. Проверьте, совпадает ли номер порта при запуске сервера Selenium с вашим скриптом.


-2

Я решаю эту проблему путем установки yum -y install gtk3-devel gtk3-devel-docs", все работает нормально

Моя работа env:

Selenium Version 3.12.0
ChromeDriver Version v2.40
Chrome 68 level

Перед:
введите описание изображения здесь введите описание изображения здесь

После:
введите описание изображения здесь введите описание изображения здесь


10
Из обзора: Пожалуйста, не размещайте текст в изображениях. РЕДАКТИРУЙТЕ свой ответ и замените эти изображения текстом. Спасибо
sɐunıɔ ןɐ qɐp

1
Решает ли это проблему для кого-либо? Это не решило проблему для меня
Бендрам

-2

Поскольку это наиболее активное сообщение для ошибок такого типа, я хотел бы упомянуть свое решение (потратив на это часы).

В Ubuntu 18.04, используя Chrome 70 и Chromedriver 2.44 и Python3, я продолжал получать ту же ошибку DevToolsActivePort, даже когда я отключил все перечисленные выше опции. Файл журнала chromedriver, также как и ps, показал, что хромедрайвер, который я установил в chrome_options.binary_location, работал, но всегда выдавал ошибку DevToolsActivePort. Когда я удалил chrome_options.binary_location = '....' и добавил его в создание веб-драйвера, я понял, что он работает нормально. webdriver.Chrome ('/ path to ... / chromedriver', chrome_options = chrome_options)

Спасибо всем за ваши комментарии, которые помогают мне понять и решить проблему.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.