拇指规则
Chrome 在启动期间崩溃的一个常见原因是在 Linux 上以 root 用户 (administrator) 运行 Chrome。虽然可以通过在创建 WebDriver 会话时传递 --no-sandbox 标志来解决此问题,但不支持并且强烈建议不要使用此类配置。您需要将环境配置为以普通用户身份运行 Chrome。
此错误消息...
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.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 内存管理。
参考
您可以在以下位置找到一些详细的讨论:
结尾
这是Sandbox故事的链接。