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

问题描述 投票:80回答:16

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

我的配置:

Chrome:66 ChromeBrowser:2.39.56

P.S一切正常,在Firefox中

google-chrome selenium selenium-webdriver webdriver selenium-chromedriver
16个回答
38
投票

此错误消息...

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

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

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

然而,根据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.ccdisable-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

在讨论Add an option to use /tmp instead of /dev/shm大卫提到:

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

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

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


0
投票

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

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

0
投票

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

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

通过删除第二行解决了这个问题。


0
投票

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

谷歌Chrome版本71.0

ChromeDriver版本2.45

CentOS7版本1.153


0
投票

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

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

而且..它的作品!


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"

-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('/ path to ... / chromedriver',chrome_options = chrome_options)

感谢大家的意见,让我了解并解决问题。


-3
投票

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

我的工作环境是:

Selenium Version 3.12.0
ChromeDriver Version v2.40
Chrome 68 level

之前:

后:


28
投票

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

18
投票

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

唯一有帮助的是设定论点

chrome_options.add_argument('--headless')

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


14
投票

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

8
投票

更新:

我能够解决这个问题,现在我可以使用所需的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);

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

谢谢你的回答。


6
投票

我最近遇到了同样的问题,经过一些试验和错误之后,它也适用于我。

必须在顶部:

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

base selenium tests.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);
    }

}

Google search Page traditional selenium tests.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.hml

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

2
投票

在我的情况下,它发生在我尝试使用我的默认用户配置文件时:

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

这触发了chrome来重用已经在后台运行的进程,这样一来,chromedriver.exe启动的进程就会结束。

解决方案:终止在后台运行的所有chrome.exe进程。


1
投票

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

};

0
投票

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

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

我希望这有助于某人=)

© www.soinside.com 2019 - 2024. All rights reserved.