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.