经验法则
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");
disable-dev-shm-usage
根据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
在讨论中,David提到添加一个选项来使用/tmp而不是/dev/shm:
我认为这取决于/dev/shm和/tmp如何挂载。
如果它们都被挂载为tmpfs,我假设不会有任何区别。
如果出于某种原因/tmp没有映射为tmpfs(我认为systemd默认映射为tmpfs), chrome共享内存管理总是在创建匿名共享文件时将文件映射到内存中,所以即使在这种情况下也不应该有太大区别。我猜你可以在启用标志的情况下强制进行遥测测试,看看效果如何。
至于为什么不默认使用,它是由共享内存团队推后的,我想它应该默认使用/dev/shm共享内存是有意义的。
最终所有这些都应该转移到使用memfd_create,但我不认为这将很快发生,因为这将需要重构Chrome内存管理显著。
参考
你可以在下面找到一些详细的讨论:
在ubuntu上执行Selenium UI测试用例时,DevToolsActivePort文件不存在错误
测试立即失败,出现未知错误:当通过systemd运行Selenium网格时,DevToolsActivePort文件不存在
另一个
这里是沙盒故事的链接。