org.openqa.selenium.WebDriverException:未知错误:尝试启动Chrome浏览器时,DevToolsActivePort文件不存在

Kum*_*ath 120 selenium google-chrome webdriver selenium-chromedriver selenium-webdriver

我正在尝试使用URL启动chrome,浏览器启动,之后它什么都不做.

我在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)
Run Code Online (Sandbox Code Playgroud)

我的配置:

Chrome:66 ChromeBrowser:2.39.56

PS在Firefox中一切正常

Deb*_*anB 55

此错误消息...

org.openqa.selenium.WebDriverException: unknown error: DevToolsActivePort file doesn't exist 
Run Code Online (Sandbox Code Playgroud)

...暗示ChromeDriver无法启动/生成新的WebBrowserChrome浏览器会话.

您的代码试验和所有二进制文件的版本信息会给我们一些关于出错的提示.

但是根据Add --disable-dev-shm-usage到默认启动标志似乎添加参数--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");
Run Code Online (Sandbox Code Playgroud)

禁用-DEV-SHM-使用

根据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
Run Code Online (Sandbox Code Playgroud)

在讨论中添加一个选项以使用/ tmp而不是/ dev/shm David提到:

我认为这将取决于/ dev/shm和/ tmp的安装方式.如果他们都作为tmpfs安装我假设没有任何区别.如果由于某种原因,/ tmp未映射为tmpfs(我认为默认情况下由systemd映射为tmpfs),Chrome共享内存管理总是在创建匿名共享文件时将文件映射到内存中,所以即使在这种情况下也不应该差别很大.我想你可以在启用标志的情况下强制进行遥测测试,看看它是怎么回事.

至于为什么不默认使用它,它是由共享内存团队推回的,我想有意义的是默认情况下应该使用/ dev/shm作为共享内存.

最终所有这一切都应该转向使用memfd_create,但我认为这不会很快发生,因为它需要显着重构Chrome内存管理.

  • 但是什么造成了关于`DevToolsActivePort文件的特定错误'不存在,为什么它突然开始弹出? (5认同)
  • 从@ DebanjanB帖子的删除部分来看,这可能是因为使用了不支持已安装Chrome版本的Chromedriver.例如,如果在未升级Chromedriver的情况下升级chrome,则会发生这种情况. (5认同)
  • 如果这对其他人有帮助,仅添加“disable-dev-shm-usage”是不够的。我还必须添加“--no-sandbox”才能使其正常工作。这是我对 Selenium-java 的完整修复:`chromeOptions.addArguments("--no-sandbox", "--disable-dev-shm-usage");` (5认同)
  • "额外考虑"项目 - 看起来它们非常适用于此问题.特别是在这种情况下,还没有确切地确定导致问题的原因. (3认同)
  • 如果上述选项都没有帮助(如我的情况) - 只需从命令行运行:`chrome --headless`,您就会看到实际的问题(在我的情况下,这是一些库不兼容)。如果您的 chrome 设置一切正常,它应该延迟几秒钟,然后返回类似以下内容的内容:“[1006/110844.401199:ERROR:browser_process_sub_thread.cc(203)] 等待 3 毫秒的网络服务” (2认同)
  • 我被这个内部docker击中了,因为我没有`--headless`。 (2认同)

Pet*_*ley 38

我在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-usage "停止了错误.我将调查这些问题以查找有关效果的更多信息,以及触发google-chrome更新的其他问题.

ChromeOptions options = new ChromeOptions();
        ...
        options.addArguments("--no-sandbox");
        options.addArguments("--disable-dev-shm-usage");
Run Code Online (Sandbox Code Playgroud)


小智 27

我们在jenkins奴隶(linux机器)上遇到了同样的问题,并尝试了上面的所有选项.

唯一有帮助的是设定论点

chrome_options.add_argument('--headless')
Run Code Online (Sandbox Code Playgroud)

但是当我们进一步调查时,注意到XVFB屏幕没有启动属性,这就是导致此错误.在我们修复XVFB屏幕后,它解决了这个问题.

  • 你能说明一下Xvfb有什么问题吗? (5认同)
  • 这解决了我的问题,当使用 C# 运行时(在这种情况下,选项看起来像这样: options.AddArgument("--headless"); (3认同)
  • XVFB 出了什么问题。你能解释一下吗? (3认同)

raf*_*asa 21

就我而言,这是 ubuntu 服务器上 CI 代理帐户的问题,我使用自定义--user-data-dir解决了这个问题

chrome_options.add_argument('--user-data-dir=~/.config/google-chrome')

CI 代理使用的我的帐户没有必要的权限,有趣的是一切都在 root 帐户上运行

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--profile-directory=Default')
chrome_options.add_argument('--user-data-dir=~/.config/google-chrome')

driver = webdriver.Chrome(options=chrome_options)
url = 'https://www.google.com'
driver.get(url) 
get_url = driver.current_url 
print(get_url)
Run Code Online (Sandbox Code Playgroud)


小智 20

我在python中遇到了同样的问题.以上帮助.这是我在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)
Run Code Online (Sandbox Code Playgroud)


Lel*_*uch 18

在首先单独下载 chromedriver 然后使用 Python Selenium 后,我在 Ubuntu 20 上遇到了这个问题,sudo apt install chromium-browser尽管它们是相同的版本,但这种情况一直在发生。

我的解决方法是使用 repo 包附带的提供的 chrome 驱动程序位于

/snap/bin/chromium.chromedriver

driver = webdriver.Chrome(chrome_options=options, executable_path='/snap/bin/chromium.chromedriver')
Run Code Online (Sandbox Code Playgroud)


Soh*_*ani 17

在我的情况下,在以下环境中:

  • 视窗 10
  • Python 3.7.5
  • 谷歌浏览器80版和路径中对应的ChromeDriver C:\Windows
  • 3.141.0

我需要将参数--no-sandbox和对象添加--remote-debugging-port=9222ChromeOptions对象中,通过以管理员身份使用 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)
Run Code Online (Sandbox Code Playgroud)


eNc*_*Nca 14

错误消息的可能原因有很多RESPONSE InitSession ERROR unknown error: DevToolsActivePort file doesn't exist(从这个问题的答案数量可以看出)。因此,让我们更深入地解释此错误消息的确切含义。

根据 chromedriver 源代码,该消息是在ParseDevToolsActivePortFile方法中创建的。该方法在启动 chrome process从循环中调用。

在循环中,驱动程序检查 chrome 进程是否仍在运行以及该ParseDevToolsActivePortFile文件是否已由 chrome 创建。此循环有一个硬编码的 60 秒超时。

我发现此消息可能有两个原因:

  • Chrome 在启动过程中确实很慢 - 例如由于缺乏系统资源 - 主要是 CPU 或内存。在这种情况下,有时 chrome 可能会在时间限制内启动,有时则无法启动。
  • 还有另一个问题会阻止 chrome 启动 - 缺少或损坏的依赖项、错误的配置等。在这种情况下,此错误消息并没有真正的帮助,您应该找到另一条日志消息来解释失败的真正原因。


Kum*_*ath 13

更新:

我能够解决这个问题,现在我可以使用所需的URL访问chrome.

尝试提供的解决方案的结果:

我尝试了上面提供的所有设置,但我无法解决问题

关于这个问题的解释:

根据我的观察,当chrome无法在scoped_dirXXXXX文件夹中找到它的引用时,会导致DevToolsActivePort文件不存在.

采取措施解决问题

  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);
    
    Run Code Online (Sandbox Code Playgroud)

使用上述步骤,我能够解决问题.

谢谢你的回答.

  • 你知道 useAutomationExtension 有什么影响吗?它禁用了自动化扩展(屏幕截图/控制等),不是吗?DevTools 的出现不应该使这种变化没有影响吗?https://codereview.chromium.org/2785413002 (4认同)

rad*_*mir 11

当 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);
Run Code Online (Sandbox Code Playgroud)

  • 它是一个恒定端口吗?或者我可以在哪里找到它? (4认同)

Sat*_*tan 10

我知道这是一个老问题并且已经有很多答案。然而,我遇到了这个问题,遇到了这个线程,并且所提出的解决方案都没有帮助。经过几天(!)的研究,我终于找到了解决方案:

我的问题是我selenium/standalone-chrome在配备 M1 芯片的 MacBook 上使用该图像。切换到seleniarm/standalone-chromium一切终于开始工作后。


小智 8

我在这个问题上坚持了很长时间,最后通过添加一个附加选项来修复它:

options.addArguments("--crash-dumps-dir=/tmp")

  • 对于 selenium 版本 4.x+,您应该将此行更改为: `chrome_options.add_argument("--crash-dumps-dir=/tmp")` 。由于 V4.X+ 已将 `addArguments()` 更改为 `add_argument()` (3认同)

Nit*_*tal 7

最近我遇到了同样的问题,经过反复试验,它也对我有用。

必须在最前面:

options.addArguments("--no-sandbox"); //has to be the very first option
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

  • 必须是第一选择——花几天时间找到这个哈哈 (4认同)

Pie*_*zza 6

正如另一个答案中所述

此错误消息...暗示 ChromeDriver 无法启动/生成新的 WebBrowser,即 Chrome 浏览器会话。

其中可能的原因,我想提一提的是,如果你正在运行通过Xvfb来的无头铬的事实,你可能需要exportDISPLAY变量:在我的情况,我在的地方(推荐使用),--disable-dev-shm-usage--no-sandbox选择,一切都运行良好,但在运行最新(在撰写本文时)Ubuntu 18.04 的新安装中,此错误开始发生,唯一可能的解决方法是执行一个export DISPLAY=":20"(之前已使用 启动 Xvfb Xvfb :20&)。


Chr*_*ini 6

您可能会因为向 Chrome 传递错误的参数而收到此错误。例如,如果我"headless"作为参数传递给 C# ChromeDriver,它会启动得很好。如果我犯了一个错误并使用了错误的语法,"--headless"我就会收到DevToolsActivePort file doesn't exist错误。


Eri*_*uer 5

老问题,但类似的问题几乎让我发疯,所以分享我的解决方案。其他建议都没有解决我的问题。

当我将 Docker 映像 Chrome 安装从旧版本更新到 Chrome 86 时,出现此错误。我的设置并不相同,但我们通过 selenium webdriver 实例化 Chrome。

解决方案是将选项作为goog:chromeOptions散列而不是chromeOptions散列传递。我真的不知道这是 Selenium、Chrome、Chromedriver 还是其他更新,但也许一些可怜的灵魂将来会在这个答案中找到安慰。


归档时间:

查看次数:

114314 次

最近记录:

6 年 前