我正在尝试使用 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
- 浏览器 : 2.39.56
附言在火狐中一切正常
经验法则
Chrome在启动过程中崩溃的一个常见原因是在Linux上以
root
用户(administrator
)身份运行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");
disable-dev-shm-usage
根据 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
在讨论中添加一个使用/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文件不存在
尾声
这是沙盒故事的链接。
我在 2018-06-04 星期一开始看到这个问题。我们的测试在每个工作日运行。似乎唯一改变的是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"停止了错误。 我将研究这些问题以查找有关效果的更多信息,以及其他问题,例如触发谷歌浏览器更新的原因。
ChromeOptions options = new ChromeOptions();
...
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
我们在 Jenkins(Linux 机器)上遇到了同样的问题,并尝试了上面的所有选项。
唯一有帮助的是设置--headless
参数:
chrome_options.add_argument('--headless')
当我们进一步调查时,我们注意到 XVFB 屏幕未启动属性,这导致了此错误。修复 XVFB 屏幕后,问题已解决。
我在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)
在我的情况下,在以下环境中:
- 视窗 10
- 蟒蛇
3.7.5
- 谷歌浏览器版本 80 和路径中的相应 ChromeDriver
C:Windows
- 硒
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)
我最近遇到了同样的问题,经过一些反复试验,它也对我有用。
必须位于顶部:
options.addArguments("--no-sandbox"); //has to be the very first option
基础硒测试.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);
}
}
谷歌搜索页面传统硒测试.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);
}
}
绒球.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然后使用sudo apt install chromium-browser
后,我在使用Python Selenium的Ubuntu 20上遇到了这个问题 即使它们是相同的版本,这种情况仍在继续发生。
我的解决方法是使用
位于/snap/bin/chromium.chromedriver
driver = webdriver.Chrome(chrome_options=options, executable_path='/snap/bin/chromium.chromedriver')
更新:
我能够解决问题,现在我能够使用所需的网址访问chrome。
尝试提供的解决方案的结果:
我尝试了上面提供的所有设置,但无法解决问题
关于该问题的说明:
根据我的观察,DevToolsActivePort文件不存在是由于chrome无法在文件夹中找到其引用scoped_dirXXXXX引起的。
为解决问题而采取的步骤
- 我已经杀死了所有的铬进程和铬驱动程序进程。
-
添加了以下代码以调用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);
使用上述步骤,我能够解决问题。
感谢您的回答。
就我而言,这是 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)
RESPONSE InitSession ERROR unknown error: DevToolsActivePort file doesn't exist
错误消息有很多可能的原因(正如我们从这个问题的答案数量中看到的那样)。因此,让我们更深入地解释此错误消息的确切含义。
根据chromedriver源代码,消息是在ParseDevToolsActivePortFile方法中创建的。此方法在启动 chrome 进程后从循环中调用。
在循环中,驱动程序检查 chrome 进程是否仍在运行,以及ParseDevToolsActivePortFile
文件是否已由 chrome 创建。此循环有一个硬编码的 60 秒超时。
我看到此消息有两个可能的原因:
- Chrome在启动过程中非常慢 - 例如由于缺乏系统资源 - 主要是CPU或内存。在这种情况下,有时会发生 chrome 设法在时间限制内启动,有时不会。
- 还有另一个问题会阻止 chrome 启动 - 缺少或损坏的依赖项、错误的配置等。在这种情况下,此错误消息并没有真正的帮助,您应该找到另一条日志消息来解释失败的真正原因。
当chromedriver无法弄清楚chrome正在使用什么调试端口时,就会发生这种情况。
一个可能的原因是 HKEY_CURRENT_USER\软件\政策\Google\Chrome\UserDataDir 的开放缺陷
但在我上一个案例中,这是其他一些不明原因。
幸运的是,手动设置端口号是有效的:
final String[] args = { "--remote-debugging-port=9222" };
options.addArguments(args);
WebDriver driver = new ChromeDriver(options);
我知道这是一个老问题,它已经有很多答案了。但是,我遇到了这个问题,遇到了这个线程,但提出的解决方案都没有帮助。花了几天(!)后,我终于找到了一个解决方案:
我的问题是我在带有M1芯片的MacBook上使用selenium/standalone-chrome
图像。切换到seleniarm/standalone-chromium
后,一切终于开始工作。
如另一个答案所述:
此错误消息...暗示ChromeDriver无法启动/生成新的WebBrowser,即Chrome浏览器会话。
在可能的原因中,我想提一下这样一个事实,如果您通过 Xvfb 运行无头 Chromium,您可能需要export
DISPLAY
变量:就我而言,我已经(按照建议)--disable-dev-shm-usage
和--no-sandbox
选项,一切运行良好,但在运行最新(在撰写本文时)Ubuntu 18.04 的新安装中,此错误开始发生, 唯一可能的解决方法是执行export DISPLAY=":20"
(之前使用Xvfb :20&
启动 Xvfb)。
我被困了很长时间,最后通过添加一个附加选项来修复它:
options.addArguments("--crash-dumps-dir=/tmp")
您可能会因为将错误的参数传递给 Chrome 而收到此错误。例如,如果我"headless"
作为参数传递给C# ChromeDriver,它会启动得很好。如果我犯了一个错误并使用了错误的语法,"--headless"
,我得到DevToolsActivePort file doesn't exist
错误。
老问题,但类似的问题几乎让我精神错乱,所以分享我的解决方案。其他建议都没有解决我的问题。
当我将 Docker 映像 Chrome 安装从旧版本更新到 Chrome 86 时,出现此错误。我的设置并不相同,但我们通过硒网络驱动程序实例化Chrome。
解决方案是将选项作为哈希传递goog:chromeOptions
而不是chromeOptions
哈希。我真的不知道这是Selenium,Chrome,Chromedriver还是其他更新,但也许将来一些可怜的灵魂会在这个答案中找到安慰。
对于 Ubuntu 20,它确实帮助我使用我的系统 chromium 驱动程序而不是下载的驱动程序:
# chromium which
/snap/bin/chromium
driver = webdriver.Chrome('/snap/bin/chromium.chromedriver',
options=chrome_options)
对于下载的 Web 驱动程序,它看起来需要设置远程调试端口 --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)
> 日期 9/16/2021
一切都运行良好 铬与硒 在本地使用 python 在 docker 托管的 ubuntu 容器内。尝试从 Jenkins 运行时,返回上述错误WebDriverException: unknown error: DevToolsActivePort
环境:
-Ubuntu21.04 在具有 RDP 访问权限的 docker 容器中。
-铬驱动程序为铬版本:93
解决方案:在启动浏览器的python文件中,我必须使用以下行设置DISPLAY
环境变量:
import os
os.environ['DISPLAY'] = ':10.0'
#DISPLAY_VAR = os.environ.get('DISPLAY')
#print("DISPLAY_VAR:", DISPLAY_VAR)
我遇到了同样的问题,但就我而言,chrome 以前安装在用户临时文件夹中,之后重新安装到程序文件中。因此,这里提供的任何解决方案都对我没有帮助。但如果提供 chrome 的路径.exe则一切正常:
chromeOptions.setBinary("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe");
我希望这对某人有所帮助=)
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("--headless");
上面的行解决了我的问题。我删除了其他可选参数。我认为其他答案中提到的其余代码行对解决云虚拟机上的问题没有任何影响。
就我而言,当我尝试使用默认用户配置文件时,它发生了:
...
options.addArguments("user-data-dir=D:\MyHomeDirectory\Google\Chrome\User Data");
...
这触发了 chrome 重用已经在后台运行的进程,这样,由 chromedriver 启动的进程.exe就简单地结束了。
解决方法:终止在后台运行的所有 chrome.exe 进程。
就我而言,我试图在带有 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
更新套件,具有以下谷歌浏览器的二进制路径:
options.setBinary("/opt/google/chrome/google-chrome");
而且..它有效!
我在与 jenkins 服务器集成时也遇到了这个问题,我被用作 jenkin 作业的根用户,当我将用户更改为其他用户时,这个问题得到了修复。我不确定为什么 root 用户会发生此错误。
- 谷歌浏览器版本 71.0
- ChromeDriver 版本 2.45
- CentOS7 版本 1.153
我用在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");
就我而言,当我更改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
没有解决方案对我有用。但这里有一个解决方法:
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.")
此错误似乎有很多可能的原因。在我们的例子中,发生错误是因为代码中有以下两行:
System.setProperty("webdriver.chrome.driver", chromeDriverPath);
chromeOptions.setBinary(chromeDriverPath);
它通过删除第二行来解决。
我遇到了同样的问题,我正在使用UBUNTU,PYTHON和OPERA浏览器。 就我而言,问题起源于因为我有一个过时的OperaDriver版本。
溶液: 1.确保您安装了最新的Opera浏览器版本(不要使用Opera测试版或Opera开发人员),为此请访问Opera官方网站并从那里下载最新的opera_stable版本。
- 安装最新的 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 如您所见
- 此外,我还安装了 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()
我遇到了同样的问题,在我的情况下,Linux 系统中有两个不同的常见用户userA和userB。userA首先运行selinium程序,该程序使用ChromeDriver成功启动chrome browswer,当涉及到userB时,发生DevToolsActivePort file doesn't exist
错误。
我尝试了--remote-debugging-port=9222
选项,但它导致了一个新的异常:selenium.common.exceptions.WebDriverException: Message: chrome not reachable
我运行谷歌-chome目录并看到以下错误:mkdir /tmp/Crashpad/new: Permission denied (13)
我搜索问题并得到这个:
https://johncylee.github.io/2022/05/14/chrome-headless-%E6%A8%A1%E5%BC%8F%E4%B8%8B-devtoolsactiveport-file-doesn-t-exist-%E5%95%8F%E9%A1%8C/
chrome_options.add_argument(f"--crash-dumps-dir={os.path.expanduser('~/tmp/Crashpad')}")
多亏了@johncylee。