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


152

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

PS在Firefox中一切正常


1
您可以使用导致此错误的代码更新问题吗?
GPT14

vncserver崩溃时我收到此错误,并且我不再显示X
xtian

Answers:


71

此错误消息...

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

...暗示ChromeDriver无法启动/产生新的WebBrowser,Chrome浏览器会话。

您的代码试用和所有二进制文件的版本信息将为我们提供一些有关出问题的提示。

但是,根据将--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");

禁用dev-shm-usage

根据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

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

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

至于为什么默认不使用它,这是共享内存团队推迟的,我想这应该在默认情况下将/ dev / shm用于共享内存是合理的。

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


奥托罗

这是沙盒故事的链接。


8
但是,是什么引起了这个关于的特定错误DevToolsActivePort file doesn't exist,为什么突然开始弹出该错误?

3
“其他注意事项”项-看起来非常适用于此问题。尤其是在这种情况下,还不能确定问题的确切原因。
皮特·凯利

5
在@DebanjanB帖子的已删除部分中,这可能是由于使用了不支持已安装的Chrome版本的Chromedriver引起的。例如,如果在不升级Chromedriver的情况下升级了chrome,则会发生这种情况。
expz

这曾经为我解决了这个问题,但不在我当前的系统上(Ubuntu 18 + Python 3.7)
tw0000

3
万一这对其他人有帮助,仅仅增加disable-dev-shm-usage是不够的。我还必须添加 --no-sandbox才能使其正常工作。这是我对Selenium-java的完整修复:chromeOptions.addArguments("--no-sandbox", "--disable-dev-shm-usage");
George Pantazes

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-usage ”可停止错误。我将研究这些问题,以找到有关效果的更多信息,以及引发google-chrome更新的其他问题。

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

我想澄清一下,此代码在每个工作日在Ubuntu Linux机器上运行,但是Windows桌面上的等效代码即使在星期一也可以运行。我没有找到有关DevToolsActivePort文件的功能的信息,这也将很有用。PK
皮特·凯利

1
这些选项也为我停止了错误。pd:使用Rails堆栈。
马里奥·佩雷斯

[java] [1536892035.965][SEVERE]: Timed out receiving message from renderer: 60.000即使这样,我仍然会出错
Jonathan

@乔纳森-嗨!您是否可以提供更多详细信息,例如所用的操作系统,所使用组件的哪个版本,或如何调用该过程?
皮特·凯利

@Toby:嗨!我并不是要暗示位置有所不同,只是最小程度地使用这些参数。升级时,似乎我所依赖的某些默认值已更改。系统或提供的消息中的任何其他详细信息可能会有所帮助。
皮特·凯利

35

我们在jenkins奴隶(Linux机器)上遇到了相同的问题,并尝试了上述所有选项。

唯一有用的是设定论点

chrome_options.add_argument('--headless')

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


2
这解决了我的问题,当使用C#运行时(在这种情况下,该选项如下所示:options.AddArgument(“-headless”);
ozz

XVFB是我的问题
lucaswxp

23

我在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),因此我也不得不升级通常的浏览器。
axel_ande '18

18

更新:

我可以解决问题,现在可以使用所需的网址访问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);
    

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

感谢您的回答。


3
您知道useAutomationExtension有什么影响吗?它禁用自动化扩展(屏幕截图/控件等),不是吗?DevTools的出现不应该使这一更改没有影响吗?codereview.chromium.org/2785413002
Toby

10

最近我遇到了同样的问题,经过一番尝试和错误,它也对我有用。

必须在最前面:

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文件?这是质量检查人员手动执行的操作吗?
尼塔拉

您使用Selenium IDE记录测试。结果是一个.side文件。使用IDE可以很好地运行它,但是我试图使用selenium-side-runner来运行它,但是chromedriver遇到了各种各样的问题。
pabrams

必须是第一选择–花几天时间找到这个哈哈
cuniculus

谢谢!添加“ --no-sandbox”解决了我的问题。
matabares

7

就我而言,在以下环境中:

  • Windows 10
  • 蟒蛇 3.7.5
  • 路径中的Google Chrome版本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)

1
对我来说,使用ubuntu 18.04,py3.7,chrome(driver)80的
docker也是一样

这对我有用,没有其他问题。我今天才刚开始遇到这个问题,但是由于您的回答,它很快得到解决!我的环境与您的环境基本相同。
Ryan Harris

5

在分别下载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')

4

如在另一个答案中所述

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

在可能的原因中,我想提到一个事实,如果您通过Xvfb运行无头的Chromium,则可能需要export使用DISPLAY变量:在我的情况下,我已经(如建议的那样)使用了--disable-dev-shm-usageand --no-sandbox选项,所有运行良好,但在运行最新版本(在撰写本文时)Ubuntu 18.04的新安装中,此错误开始发生,并且唯一可能的解决方法是执行export DISPLAY=":20"(以前使用来启动Xvfb Xvfb :20&)。


天哪谢谢你 我对Docker容器进行了一些更改,但我不小心遗漏了xvfb。如果您还没有把这个留在这里,我永远不会找到这个。
Ryan Shillington

3

与jenkins服务器集成时,我也遇到了这个问题,我被用作jenkin 作业的用户,当我将用户更改为其他用户时,该问题已解决。我不确定为什么root用户会发生此错误。

  • Google Chrome版本71.0
  • ChromeDriver 2.45版
  • CentOS7版本1.153

非root用户为我工作,我拥有适用于Chrome的正确chrome驱动程序版本。
6

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

就我而言,我试图在Windows OS上使用chrome浏览器创建可运行的jar,并希望在无头模式下在带有CentO的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及其工具,在自动化套件和Bingo中安装二进制文件并将其指向该二进制文件!有用 :)

下载命令:

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#代码
-pabrams

1

我遇到了同样的问题,但在我看来,以前将chrome安装在用户temp文件夹中,然后将其重新安装到Program文件中。因此,此处提供的任何解决方案都无济于事。但是,如果提供chrome.exe的路径,那么所有方法都可以:

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

我希望这可以帮助某人=)


似乎与@shiuu fix下面完全相反
Toby

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"以arg形式传递给C#ChromeDriver,则启动效果很好。如果我输入了错误并使用了错误的语法"--headless",则会收到DevToolsActivePort file doesn't exist错误消息。


1

我遇到了同样的问题,我正在使用UBUNTU,PYTHON和OPERA浏览器。就我而言,问题是由于我的Operadriver版本过旧而引起的。

解决方案:1.确保安装了最新的Opera浏览器版本(不要使用Opera beta或Opera开发人员),为此请转到官方Opera网站并从那里下载最新的Opera_stable版本。

  1. 安装最新的Opera驱动程序(如果已经安装了Opera驱动程序,则必须先使用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修复完全相反:'(
Toby

在我们的setBinary中,我们尝试设置chrome驱动程序,这似乎是一个错误。@ sergiy-konoplyaniy的修复程序通过setBinary设置了chrome.exe。
shiuu

您在哪里有此代码?我只有一个.side文件,并且其中没有C#代码。
pabrams,

0

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

0

就我而言,我处于Kubernetes环境中,在这里我无法使用默认的TMPDIR,因为它将用垃圾填满temp目录。

所以我用这个来使用不同的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
它是恒定端口吗?或者我在哪里可以找到它?
Mike Shiyan


-2

我通过安装yum -y install gtk3-devel gtk3-devel-docs“ 解决了这个问题,可以正常工作

我的工作环境是:

Selenium Version 3.12.0
ChromeDriver Version v2.40
Chrome 68 level

之前:
在此处输入图片说明 在此处输入图片说明

后:
在此处输入图片说明 在此处输入图片说明


9
点评来源:请不要在图片中张贴文字。编辑您的答案,然后将这些图像替换为文本。谢谢
sɐunıɔןɐqɐp

1
这对任何人都可以解决问题吗?这并没有解决这个问题对我来说
Bendram

-2

由于这是此类错误最活跃的消息,因此我想提一下我的解决方案(花了几个小时来解决这个问题)。

在Ubuntu 18.04上,使用Chrome 70,Chromedriver 2.44和Python3,即使我禁用了上面列出的所有选项,我仍然遇到相同的DevToolsActivePort错误。chromedriver日志文件以及ps表明我在chrome_options.binary_location中设置的chromedriver正在运行,但始终会出现DevToolsActivePort错误。当我删除chrome_options.binary_location ='....'并将其添加到webdriver创建中时,我​​可以正常使用。webdriver.Chrome('/ ...的路径/ chromedriver',chrome_options = chrome_options)

感谢大家的宝贵意见,这些意见使我理解并解决了该问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.