提问人:Kumar Sampath 提问时间:6/1/2018 最后编辑:frianHKumar Sampath 更新时间:10/1/2023 访问量:571525
WebDriverException:未知错误:尝试启动 Chrome 浏览器时 DevToolsActivePort 文件不存在
WebDriverException: unknown error: DevToolsActivePort file doesn't exist while trying to initiate Chrome Browser
问:
我正在尝试使用 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 中一切正常
答:
经验法则
Chrome 在启动过程中崩溃的一个常见原因是在 Linux 上以
root
用户(管理员
)身份运行 Chrome。虽然可以通过在创建 WebDriver 会话时传递--no-sandbox
标志来解决此问题,但不支持此类配置,并且强烈建议不要这样做。您需要将环境配置为以普通用户身份运行 Chrome。
此错误消息...
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");
禁用开发 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
在讨论中,添加一个选项以使用 /tmp 而不是 /dev/shm David 提到:
我认为这取决于 /dev/shm 和 /tmp 的挂载方式。 如果它们都作为 tmpfs 挂载,我假设不会有任何区别。 如果由于某种原因 /tmp 没有映射为 tmpfs(我认为 systemd 默认映射为 tmpfs),chrome 共享内存管理在创建匿名共享文件时始终将文件映射到内存中,因此即使在这种情况下也应该没有太大区别。我想你可以在启用标志的情况下强制进行遥测测试,看看它是如何进行的。
至于为什么不默认使用,这是共享内存团队的推回,我想默认情况下应该使用 /dev/shm 作为共享内存是有道理的。
最终,所有这些都应该转向使用memfd_create,但我认为这不会很快发生,因为它需要大量重构 Chrome 内存管理。
参考
您可以在以下位置找到一些详细的讨论:
- 未知错误:在 ubuntu 上执行 Selenium UI 测试用例时出现 DevToolsActivePort 文件不存在错误
- 测试立即失败,并出现未知错误:通过 systemd 运行 Selenium 网格时,DevToolsActivePort 文件不存在
尾声
这是 Sandbox 故事的链接。
评论
DevToolsActivePort file doesn't exist
disable-dev-shm-usage
--no-sandbox
chromeOptions.addArguments("--no-sandbox", "--disable-dev-shm-usage");
chrome --headless
[1006/110844.401199:ERROR:browser_process_sub_thread.cc(203)] Waited 3 ms for network service
我在 2018 年 6 月 4 日星期一开始看到这个问题。我们的测试每个工作日都会进行。似乎唯一改变的是 google-chrome 版本(已更新到当前版本)JVM 和 Selenium 是 Linux 盒子上的最新版本(Java 1.8.0_151、selenium 3.12.0、google-chrome 67.0.3396.62 和 xvfb-run)。
特别是添加参数“--no-sandbox”和“--disable-dev-shm-usage”阻止了错误。
我将研究这些问题以查找有关效果的更多信息,以及其他问题,例如触发 google-chrome 更新的原因。
ChromeOptions options = new ChromeOptions();
...
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
评论
[java] [1536892035.965][SEVERE]: Timed out receiving message from renderer: 60.000
更新:
我能够解决这个问题,现在我能够使用所需的 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);
使用上述步骤,我能够解决问题。
感谢您的回答。
评论
我在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 之前安装在用户临时文件夹中,之后重新安装到 Program 文件中。所以这里提供的任何解决方案都对我没有帮助。但是,如果提供chrome.exe的路径,则所有工作:
chromeOptions.setBinary("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");
我希望这对某人有所帮助=)
评论
我们在 Jenkins(Linux 机器)上遇到了同样的问题,并尝试了上述所有选项。
唯一有帮助的是设定论点:--headless
chrome_options.add_argument('--headless')
当我们进一步调查时,我们注意到 XVFB 屏幕没有启动属性,这导致了此错误。修复 XVFB 屏幕后,问题得到了解决。
评论
没有适合我的解决方案。但这里有一个解决方法:
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.")
就我而言,当我尝试使用我的默认用户配置文件时,它发生了:
...
options.addArguments("user-data-dir=D:\\MyHomeDirectory\\Google\\Chrome\\User Data");
...
这触发了 chrome 重用已经在后台运行的进程,以这种方式,由 chromedriver.exe 启动的进程被简单地结束了。
解决方法:终止在后台运行的所有 chrome.exe 进程。
评论
就我而言,我试图使用 chrome 浏览器在 Windows 操作系统上创建一个可运行的 jar,并希望在带有 CentOs 的 unix box 中以无头模式运行相同的 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");
和。。它有效!
评论
此错误似乎有很多可能的原因。在我们的例子中,发生错误是因为我们在代码中有以下两行:
System.setProperty("webdriver.chrome.driver", chromeDriverPath);
chromeOptions.setBinary(chromeDriverPath);
通过删除第二行来解决。
评论
我在与 jenkins 服务器集成时也遇到了这个问题,我使用了 root 用户进行 jenkin 作业,当我将用户更改为其他用户时,该问题已修复。我不确定为什么root用户会出现此错误。
- Google Chrome 版本 71.0
- ChromeDriver 的 2.45版
- CentOS7 版本 1.153
评论
将 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']
}
},
};
我最近遇到了同样的问题,经过一些反复试验,它也对我有用。
必须位于顶部:
options.addArguments("--no-sandbox"); //has to be the very first option
BaseSelenium测试.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>
评论
如另一个答案所述:
此错误消息...意味着 ChromeDriver 无法启动/生成新的 WebBrowser,即 Chrome 浏览器会话。
在可能的原因中,我想提一下这样一个事实,即如果您通过 Xvfb 运行无头 Chromium,您可能需要变量:就我而言,我已经准备好(按照建议)和 选项,一切都运行良好,但是在运行最新(撰写本文时)Ubuntu 18.04 的新安装中,此错误开始发生, 唯一可能的修复是执行一个(之前用 )。export
DISPLAY
--disable-dev-shm-usage
--no-sandbox
export DISPLAY=":20"
Xvfb :20&
评论
您可能只是因为将错误的参数传递给 Chrome 而收到此错误。例如,如果我将 arg 作为参数传递给 C# ChromeDriver,它会很好地启动。如果我犯了一个错误并使用了错误的语法,我就会得到错误。"headless"
"--headless"
DevToolsActivePort file doesn't exist
评论
headless
--headless
当 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);
评论
就我而言,在以下环境中:
- 视窗 10
- 蟒
3.7.5
- 路径中的 Google Chrome 版本 80 和相应的 ChromeDriver
C:\Windows
- 硒
3.141.0
我需要将参数和添加到对象中,并通过以管理员身份使用 Powershell/cmd 作为管理员用户运行代码。--no-sandbox
--remote-debugging-port=9222
ChromeOptions
下面是相关的代码段:
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、PYTHON 和 OPERA 浏览器。就我而言,问题源于我的 Operadriver 版本过时。
溶液: 1.确保安装最新的opera浏览器版本(不要使用opera beta或opera developer),为此,请访问Opera官方网站并从那里下载最新的opera_stable版本。
- 安装最新的 opera 驱动程序(如果您已经安装了 opera 驱动程序,则必须先使用 sudo rm 将其删除......
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,如您所见
此外,我还安装了 chromedriver(但由于我在测试之前已经这样做了,我不知道这是需要的)为了安装 chromedriver,请按照上一步中的步骤操作:v
享受并感谢我!
示例硒代码
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()
在首先单独下载 chromedriver 然后使用 Ubuntu 20 之后,我使用 Python Selenium 在 Ubuntu 上遇到了这个问题,即使它们是相同的版本,这种情况也会不断发生。sudo apt install chromium-browser
我的解决方法是使用提供的 chrome 驱动程序,该驱动程序随 repo 包一起提供,位于
/snap/bin/chromium.chrome驱动程序
driver = webdriver.Chrome(chrome_options=options, executable_path='/snap/bin/chromium.chromedriver')
评论
我使用在 Ubuntu 18 LTS linux 上运行的 Jenkins 运行 selenium 测试。我遇到了这个错误,直到我添加了这样的参数“headless”(以及其他一些参数):
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");
有同样的问题。我正在 Google 云 VM 上运行 selenium 脚本。
options.addArguments("--headless");
上面的行解决了我的问题。我删除了其他可选参数。我认为其他答案中提到的其余代码行对解决云 VM 上的问题没有任何影响。
老问题,但类似的问题几乎让我精神错乱,所以分享我的解决方案。其他建议都没有解决我的问题。
当我将 Docker 映像 Chrome 安装从旧版本更新到 Chrome 86 时,出现此错误。我的设置不相同,但我们是通过 selenium 网络驱动程序实例化 Chrome。
解决方案是将选项作为哈希而不是哈希传递。我真的不知道这是 Selenium、Chrome、Chromedriver 还是其他更新,但也许将来一些可怜的灵魂会在这个答案中找到安慰。goog:chromeOptions
chromeOptions
评论
goog:chromeOptions
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument(...)
chrome_options = webdriver.ChromeOptions({"goog:chromeOptions": { args: ["headless"] })
对于 Ubuntu 20,它确实帮助我使用我的系统 chromium 驱动程序而不是下载的驱动程序:
# chromium which
/snap/bin/chromium
driver = webdriver.Chrome('/snap/bin/chromium.chromedriver',
options=chrome_options)
对于下载的 webdriver,它看起来需要设置远程调试端口 --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)
就我而言,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)
评论
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH.
FROM python:3.8-slim-buster
就我而言,当我更改 AND 版本时,错误已修复:)google-chrome
chromedriver
#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:硒版本是3.9.1
错误消息有很多可能的原因(从这个问题的答案数量可以看出)。因此,让我们更深入地解释此错误消息的确切含义。RESPONSE InitSession ERROR unknown error: DevToolsActivePort file doesn't exist
根据 chromedriver 源代码,该消息是在 ParseDevToolsActivePortFile 方法中创建的。此方法是在启动 chrome 进程后从循环中调用的。
在循环中,驱动程序检查 chrome 进程是否仍在运行,以及文件是否已由 chrome 创建。此循环存在硬编码的 60 秒超时。ParseDevToolsActivePortFile
我看到此消息有两个可能的原因:
- Chrome 在启动过程中真的很慢 - 例如由于缺乏系统资源 - 主要是 CPU 或内存。在这种情况下,有时可能会发生 chrome 设法在时间限制内启动,有时则不然。
- 还有另一个问题阻止 chrome 启动 - 缺少或损坏的依赖项、错误的配置等。在这种情况下,此错误消息并不真正有用,您应该找到另一条日志消息来解释失败的真正原因。
日期: 2021/9/16
一切正常,在 docker 托管的 ubuntu 容器中使用 python 在本地运行带有 selenium 的 chrome。尝试从 Jenkins 运行时,返回上述错误WebDriverException: unknown error: DevToolsActivePort
环境:
-Ubuntu21.04 在具有 RDP 访问权限的 docker 容器内。
-Chrome 版 - Chrome 驱动程序:93
溶液:在启动浏览器的 python 文件中,我必须使用以下行设置环境变量:DISPLAY
import os
os.environ['DISPLAY'] = ':10.0'
#DISPLAY_VAR = os.environ.get('DISPLAY')
#print("DISPLAY_VAR:", DISPLAY_VAR)
我被困在这个问题上很长一段时间,最后通过添加一个附加选项来修复它:
options.addArguments("--crash-dumps-dir=/tmp")
评论
chrome_options.add_argument("--crash-dumps-dir=/tmp")
addArguments()
add_argument()
我遇到了同样的问题,就我而言,Linux系统中有两个不同的常见用户userA和userB。userA 首先运行 selinium 程序,该程序使用 ChromeDriver 成功启动 chrome browswer,当涉及到用户 B 时,会发生错误。DevToolsActivePort file doesn't exist
我尝试了该选项,但它导致了一个新的异常:--remote-debugging-port=9222
selenium.common.exceptions.WebDriverException: Message: chrome not reachable
我运行了google-chome目录,并看到以下错误:
mkdir /tmp/Crashpad/new: Permission denied (13)
chrome_options.add_argument(f"--crash-dumps-dir={os.path.expanduser('~/tmp/Crashpad')}")
感谢@johncylee。
评论
我知道这是一个老问题,它已经有很多答案了。但是,我遇到了这个问题,碰到了这个线程,提出的解决方案都没有帮助。花了几天时间(!),我终于找到了一个解决方案:
我的问题是我在配备 M1 芯片的 MacBook 上使用硒/独立镀铬
映像。在切换到 seleniarm/standalone-chromium
后,一切终于开始工作了。
评论
export DISPLAY=:0