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

Posted

技术标签:

【中文标题】WebDriverException:未知错误:尝试启动 Chrome 浏览器时 DevToolsActivePort 文件不存在【英文标题】:WebDriverException: unknown error: DevToolsActivePort file doesn't exist while trying to initiate Chrome Browser 【发布时间】:2018-11-11 12:42:59 【问题描述】:

我正在尝试使用 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)

我的配置:

铬:66 Chrome 浏览器:2.39.56

P.S在 Firefox 中一切正常

【问题讨论】:

当 vncserver 崩溃并且我没有 X 显示时收到此错误 【参考方案1】:

拇指规则

Chrome 在启动期间崩溃的一个常见原因是在 Linux 上以 root 用户 (administrator) 运行 Chrome。虽然可以通过在创建 WebDriver 会话时传递 --no-sandbox 标志来解决此问题,但不支持并且强烈建议不要使用此类配置。您需要将环境配置为以普通用户身份运行 Chrome。


此错误消息...

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

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

您的代码试验和所有二进制文件的版本信息会给我们一些关于出了什么问题的提示。

但是根据Add --disable-dev-shm-usage to default launch flags 似乎添加参数 --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");

禁用-dev-shm-使用

根据base_switches.cc disable-dev-shm-usage 似乎只在 Linux OS 上有效:

#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

在Add an option to use /tmp instead of /dev/shmDavid 的讨论中提到:

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

至于为什么不默认使用,这是共享内存团队的推后,我想应该是默认使用/dev/shm作为共享内存。

最终这一切都应该转移到使用 memfd_create,但我认为这不会很快发生,因为这需要大量重构 Chrome 内存管理。


参考

您可以在以下位置找到一些详细的讨论:

unknown error: DevToolsActivePort file doesn't exist error while executing Selenium UI test cases on ubuntu Tests fail immediately with unknown error: DevToolsActivePort file doesn't exist when running Selenium grid through systemd

结尾

这是Sandbox故事的链接。

【讨论】:

但是是什么导致了这个关于DevToolsActivePort file doesn't exist的具体错误,为什么突然开始弹出? “其他注意事项”项目 - 它们看起来非常适用于这个问题。尤其是这种情况还没有确定到底是什么导致了问题。 从@DebanjanB 帖子的已删除部分来看,这可能是由于使用了不支持已安装 Chrome 版本的 Chrome 驱动程序造成的。例如,如果在没有升级 Chrome 驱动程序的情况下升级了 chrome,就会发生这种情况。 如果这对其他人有帮助,仅添加 disable-dev-shm-usage 是不够的。我还必须添加--no-sandbox 才能让它工作。这对我来说是 Selenium-java 的完整修复:chromeOptions.addArguments("--no-sandbox", "--disable-dev-shm-usage"); 如果上述选项都没有帮助(在我的情况下) - 只需从命令行运行:chrome --headless,您将看到实际问题(在我的情况下是一些库不兼容)。如果您的 chrome 设置一切正常,它应该延迟几秒钟,然后返回类似:[1006/110844.401199:ERROR:browser_process_sub_thread.cc(203)] Waited 3 ms for network service 【参考方案2】:

我在 2018 年 6 月 4 日星期一开始看到这个问题。我们的测试每个工作日运行。似乎唯一改变的是 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");

【讨论】:

我想澄清一下,这个代码每个工作日都在 Ubuntu Linux 机器上运行,但 Windows 桌面上的等效代码即使在周一也运行良好。我没有找到关于 DevToolsActivePort 文件的功能的信息,这也很有用。 PK 这些选项也为我停止了错误。 pd:使用 Rails 堆栈。 即使这样,我仍然会收到 [java] [1536892035.965][SEVERE]: Timed out receiving message from renderer: 60.000 错误 @Jonathan - 嗨!您能否提供更多详细信息,例如您使用的操作系统、您使用的组件版本或您如何调用该流程? @Toby:嗨!我并不是要暗示位置有所不同,只是对这些参数的最小使用。升级发生时,我所依赖的一些默认值似乎发生了变化。您提供的有关您的系统或消息的任何其他详细信息可能会有所帮助。【参考方案3】:

我们在我们的 jenkins slave(linux 机器)上遇到了同样的问题,并尝试了上述所有选项。

唯一有帮助的就是设置参数

chrome_options.add_argument('--headless')

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

【讨论】:

这解决了我在使用 C# 运行时的问题(在这种情况下,选项如下所示:options.AddArgument("--headless"); XVFB 对我来说是个问题 XVFB 有什么问题。你能解释一下吗? 这绝对解决了我的问题!我试图在 Ubuntu 20.04 headless 上运行 selenium 和 chromedriver 的 python3.9 项目,但我一直收到 OP 的错误。有了你的加入,我就开始工作了!谢谢! 就是这样 - 谢谢! xvfb 尚未在服务器上启动。一旦我开始它,一切都没有问题。希望最初的错误消息至少对追踪这一点更有帮助。【参考方案4】:

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

【讨论】:

我通过升级 chrome 解决了我的问题(我已经有了最新的 chromedrive),因此我也必须升级常用的浏览器。 非常感谢,这对 google colab 也很有帮助【参考方案5】:

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

必须在顶部:

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 运行良好,但我尝试使用 selenium-side-runner 运行它,但在使用 chromedriver 时遇到了各种问题。 必须是第一选择 -- 花几天时间找到这个哈哈【参考方案6】:

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

Windows 10 蟒蛇3.7.5 Google Chrome 版本 80 和路径 C:\Windows 中对应的 ChromeDriver 硒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)

【讨论】:

对于我来说,使用 ubuntu 18.04、py3.7、chrome(driver) 80 的 docker 也是如此 这对我有用,没有其他问题。我今天刚开始遇到这个问题,但是由于您的回答,它很快就解决了!我的环境和你的基本一样。 在 ubuntu 18 和 jenkins 上它是这样工作的。在我的情况下,“无头”论点作为重要论点缺失.. remote-debugging-port=9222 no-sandbox 和 disable-dev-shm-usage 在 Fedora 33 上为我工作 为我工作。 python 3.7.3,ubuntu 20.04,chrome 87.0.4280【参考方案7】:

更新:

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

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

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

问题说明:

根据我的观察,DevToolsActivePort 文件不存在是由于 chrome 无法在 scoped_dirXXXXX 文件夹中找到其引用。

解决问题的步骤

    我已经杀死了所有的 chrome 进程和 chrome 驱动程序进程。

    添加以下代码来调用 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);
    

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

感谢您的回答。

【讨论】:

你知道useAutomationExtension有什么影响吗?它禁用自动化扩展(屏幕截图/控制等)不是吗? DevTools 的出现不应该使这种变化没有影响吗? codereview.chromium.org/2785413002【参考方案8】:

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

我的解决方法是使用位于

的 repo 包附带的提供的 chrome 驱动程序

/snap/bin/chromium.chromedriver

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

【讨论】:

非常感谢。这对我有帮助:规格:Ubuntu 20.04,python 3.8,带有基于 snap 的 Chromium 安装。 你救了我的命 +1 如你所见,在 Ubuntu 上工作时,Chromium 浏览器似乎还安装了一个兼容的 chrome 驱动程序,它总是会干扰从 chromedriver.chromium.org/downloads 下载的驱动程序。预装驱动程序的默认位置位于:/snap/bin/chromium.chromedriver 在下面的帖子中搜索 snap 以获取更多信息。 pythonfixing.com/2021/10/… 让它工作的建议是:不要自己下载驱动程序。使用 snap/bin 中的那个。否则你总是会得到这个错误!【参考方案9】:

在我的情况下,ubuntu 服务器上的 CI 代理帐户有问题,我使用自定义 --user-data-dir

解决了这个问题

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

CI Agent 使用的我的帐户没有必要的权限,有趣的是一切都在 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)

【讨论】:

我收到此错误selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. 有人找到解决此问题的方法吗? 这个选项对我有用,但只有当我添加了上述所有参数时。缺少一个,任何一个,都会导致我得到同样的错误。我在 docker FROM python:3.8-slim-buster 图像中使用 selenium。 这也适用于在没有 root 的 docker 镜像中使用自定义用户【参考方案10】:

如this other answer中所述:

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

在可能的原因中,我想提一下,如果您通过 Xvfb 运行无头 Chromium,您可能需要export DISPLAY 变量:在我的在这种情况下,我已经准备好(按照推荐)--disable-dev-shm-usage--no-sandbox 选项,一切都运行良好,但是在运行最新的(在撰写本文时)Ubuntu 18.04 的新安装中,这个错误开始发生,并且唯一可能的解决方法是执行export DISPLAY=":20"(之前使用Xvfb :20&amp; 启动Xvfb)。

【讨论】:

天哪,谢谢。我正在对我们的 docker 容器进行一些更改,但我不小心遗漏了 xvfb。如果你没有把它留在这里,我永远不会找到这个 :-)。 使用 xvfb-run 也是一种选择。 这几乎完全适合我,在这里查看我的答案***.com/a/67747781/6875391【参考方案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);

【讨论】:

是常量端口吗?或者我在哪里可以找到它?【参考方案12】:

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

【讨论】:

谢谢!这是我一直在寻找的错误,它是 headless 而不是 --headless【参考方案13】:

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

根据 chromedriver 源代码,消息是在 ParseDevToolsActivePortFile 方法中创建的。这个方法在launching chrome process之后被称为from the loop。

在循环中,驱动程序检查 chrome 进程是否仍在运行,以及 ParseDevToolsActivePortFile 文件是否已由 chrome 创建。这个循环有一个hardcoded 60s timeout。

我看到此消息的两个可能原因:

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

【讨论】:

【参考方案14】:

我遇到了同样的问题,但在我的情况下,chrome 以前安装在用户临时文件夹中,之后重新安装到程序文件中。所以这里提供的任何解决方案都对我没有帮助。但如果提供 chrome.exe 的路径一切正常:

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

我希望这对某人有帮助 =)

【讨论】:

似乎与下面的@shiuu fix 完全相反【参考方案15】:

将 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']
    
  ,

;

【讨论】:

【参考方案16】:

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

当我将我的 Docker 映像 Chrome 安装从旧版本更新到 Chrome 86 时,我收到了这个错误。我的设置不一样,但我们通过 selenium webdriver 实例化 Chrome。

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

【讨论】:

您能再描述一下您是如何使用goog:chromeOptions 的吗?现在我正在使用chrome_options = webdriver.ChromeOptions()chrome_options.add_argument(...) 不幸的是,我最近离开了实现此@CPak 的公司,所以我面前没有代码示例。我使用的是 Ruby 驱动程序,我相信它只是传递给 ChromeOptions() 的哈希值。像chrome_options = webdriver.ChromeOptions("goog:chromeOptions": args: ["headless"] ) 这样的东西。抱歉,我没有准确的语法 sn-p。【参考方案17】:

日期 2021 年 9 月 16 日

在 docker 托管的 ubuntu 容器内使用 python 在本地运行带有 selenium 的 chrome,一切正常。尝试从 Jenkins 运行时,返回上述错误 WebDriverException: unknown error: DevToolsActivePort

环境:

-Ubuntu21.04 在具有 RDP 访问权限的 docker 容器内。

-chromedriver for chrome 版本:93

解决方案: 在启动浏览器的 python 文件中,我必须使用以下行设置 DISPLAY 环境变量:

import os

os.environ['DISPLAY'] = ':10.0'
#DISPLAY_VAR = os.environ.get('DISPLAY')
#print("DISPLAY_VAR:", DISPLAY_VAR)

【讨论】:

【参考方案18】:

就我而言,它发生在我尝试使用我的默认用户配置文件时:

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

这触发了 chrome 以重用已经在后台运行的进程,这样,由 chromedriver.exe 启动的进程就被简单地结束了。

解决方法:杀死所有在后台运行的 chrome.exe 进程。

【讨论】:

我遇到了类似的问题,但在 linux 中 - 脚本崩溃后我的 chrome 进程没有正确退出,并且它们被错误地重用。杀死他们解决了问题【参考方案19】:

就我而言,我试图在带有 chrome 浏览器的 Windows 操作系统上创建一个可运行的 jar,并希望在带有 CentOs 的 unix 盒子中以无头模式运行相同的 jar。我将我的二进制文件指向我已经下载并与我的套件打包的驱动程序。对我来说,无论添加以下内容,此问题都会继续发生:

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

我尝试并为我工作的解决方案是,在主机 VM/Unix 机器上下载 chrome 及其工具,在自动化套件和宾果游戏中安装并将二进制文件指向此!它有效:)

下载命令:

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

而且.. 它有效!

【讨论】:

我们在哪里添加这段代码?我的 .side 文件中没有看到 C# 代码【参考方案20】:

我在与 jenkins 服务器集成时也遇到了这个问题,我使用 root 用户进行 jenkin 作业,当我将用户更改为其他用户时问题已修复 .我不确定为什么 root 用户会出现此错误。

谷歌浏览器版本 71.0 Chrome 驱动程序 2.45 版 CentOS7 版本 1.153

【讨论】:

非root用户为我工作,我有正确的铬驱动程序版本。【参考方案21】:

我使用在 Ubuntu 18 LTS linux 上运行的 Jenkins 运行 selenium 测试。在我像这样添加“无头”参数(和其他一些参数)之前,我遇到了这个错误:

ChromeOptions options = new ChromeOptions();
options.addArguments("headless"); // headless -> no browser window. needed for jenkins
options.addArguments("disable-infobars"); // disabling infobars
options.addArguments("--disable-extensions"); // disabling extensions
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("--no-sandbox"); // Bypass OS security model
ChromeDriver driver = new ChromeDriver(options);

driver.get("www.google.com");

【讨论】:

【参考方案22】:

有同样的问题。我正在谷歌云虚拟机上运行 selenium 脚本。

options.addArguments("--headless");

以上行解决了我的问题。我删除了其他可选参数。我认为其他答案中提到的其余代码行对解决云 VM 上的问题没有任何影响。

【讨论】:

【参考方案23】:

对于 Ubuntu 20,它确实帮助我使用我的系统 chromium 驱动程序而不是下载的驱动程序:

# chromium which
/snap/bin/chromium

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

对于下载的网络驱动程序,它看起来需要设置远程调试端口 --remote-debugging-port=9222,如答案之一(由 Soheil Pourbafrani 提供):

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--remote-debugging-port=9222")
driver = webdriver.Chrome('<path_to>/chromedriver', options=chrome_options)

【讨论】:

【参考方案24】:

没有适合我的解决方案。但这里有一个解决方法:

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

【讨论】:

【参考方案25】:

这个错误似乎有很多可能的原因。在我们的例子中,发生错误是因为我们在代码中有以下两行:

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

去掉第二行就解决了。

【讨论】:

似乎与上面的@sergiy-konoplyaniy 修复完全相反:'( 在我们的 setBinary 中,我们尝试设置 chrome 驱动程序,这似乎是一个错误。 @sergiy-konoplyaniy 的修复通过 setBinary 设置 chrome.exe。 你在哪里有这个代码?我只有一个 .side 文件,里面没有 C# 代码。 哈哈哈,这为我解决了问题,但没有删除这一行并添加它!谢谢)似乎驱动程序无法使用默认路径找到我的可执行文件。但是为什么id不直接说这个,显示奇怪的信息....【参考方案26】:

我遇到了同样的问题,我使用的是 UBUNTU、PYTHON 和 OPERA 浏览器。就我而言,问题的根源在于我的operadriver版本过时。

解决方案: 1. 确保您安装了最新的opera浏览器版本(不要使用opera beta或opera developer),为此请前往官方opera网站并从那里下载最新的opera_stable版本。

    安装最新的opera驱动(如果你已经安装了opera驱动,你必须先用sudo rm删除它...)

wgethttps://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

    1234563 >

    享受并感谢我!

硒代码示例

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()

【讨论】:

【参考方案27】:

就我而言,当我更改 google-chromechromedriver 版本时,错误已修复:)

#google-chrome version
[root@localhost ~]# /usr/bin/google-chrome --version
Google Chrome 83.0.4103.106 

#chromedriver version
[root@localhost ~]# /usr/local/bin/chromedriver -v
ChromeDriver 83.0.4103.14 (be04594a2b8411758b860104bc0a1033417178be-refs/branch-heads/4103@#119)

ps:selenium 版本是 3.9.1

【讨论】:

【参考方案28】:

我在 Docker 容器中通过 Behat/Mink 和 Selenium 运行 Chrome 时遇到了同样的问题。经过一番摆弄,我到达了以下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"

【讨论】:

【参考方案29】:

在我的例子中,我在 Kubernetes 环境中无法使用默认的 TMPDIR,因为它会用垃圾填满临时目录。

所以我用它来使用不同的 tmpdir:

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

但现在我已将所有内容升级到最新版本,这似乎不再有效。我需要找到一种新的方法来做到这一点。

【讨论】:

【参考方案30】:

在我的情况下端口号错误。检查启动 Selenium 服务器时的端口号是否与脚本中的端口号相同。

【讨论】:

以上是关于WebDriverException:未知错误:尝试启动 Chrome 浏览器时 DevToolsActivePort 文件不存在的主要内容,如果未能解决你的问题,请参考以下文章

java WebDriverException:未知错误:Chrome无法启动:异常退出

org.openqa.selenium.WebDriverException:未知错误:Chrome 启动失败:异常退出

selenium.common.exceptions.WebDriverException:消息:未知错误:调用函数结果缺少“值”

Selenium WebDriverException:消息:未知错误:无法根据未知错误确定加载状态:缺少或无效的“entry.level”

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

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