You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Windows服务运行Selenium Grid/ChromeDriver时文件读取异常求助

解决Windows服务运行Selenium Grid时ChromeDriver无法读取文件的问题

我之前处理过完全一样的场景,这个问题的核心是Windows服务的运行上下文限制和ChromeDriver在特殊环境下的路径解析逻辑冲突,下面是具体的分析和可落地的解决方案:

为什么会出现这个矛盾?

你提到File.Exists检测文件存在,但sendKeys报错,本质是两个进程的运行环境不一样:

  • 你的服务进程(Selenium Grid Node)能直接访问文件系统,所以File.Exists返回true;
  • 但ChromeDriver驱动的Chrome浏览器进程运行在Session 0(Windows服务默认会话),这个会话和用户登录会话隔离,权限、工作目录都和你正常运行时不同,导致Chrome找不到文件。

一步步解决问题

1. 必须使用绝对文件路径

Windows服务的默认工作目录是C:\Windows\System32,不是你启动服务的目录,相对路径在这里完全无效。把文件路径改成完整的绝对路径:

// 替换成你的实际文件路径
string filePath = @"C:\Full\Path\To\Your\File.pdf";
driver.FindElement(By.CssSelector("input[type='file']")).SendKeys(filePath);

2. 给服务配置有权限的运行账户

默认的Local System账户受Session 0隔离限制,访问用户私有目录(比如C:\Users\你的用户名\)会有障碍,你可以:

  • 打开「服务」管理器,找到你的Selenium Grid Node服务
  • 右键→属性→切换到「登录」标签页
  • 选择「此账户」,输入你日常使用的、能访问目标文件的用户账户和密码
  • 重启服务,让服务以该用户身份运行

3. 更新Chrome无头模式配置

旧版Chrome的--headless模式在文件处理上有兼容性问题,换成新版无头模式并添加必要参数:

ChromeOptions options = new ChromeOptions();
// 使用新版无头模式,行为更接近正常浏览器
options.AddArgument("--headless=new");
// 禁用沙箱,避免服务环境下的权限拦截
options.AddArgument("--no-sandbox");
// 允许Chrome访问本地文件
options.AddArgument("--allow-file-access-from-files");
// 可选:指定一个服务进程能访问的Chrome配置目录
options.AddArgument(@"--user-data-dir=C:\Selenium\ChromeServiceProfile");

4. 确认文件的访问权限

确保目标文件和所在目录对服务运行的账户有读取权限:

  • 右键文件→属性→「安全」标签页
  • 检查服务账户是否在权限列表中,且有「读取」权限
  • 如果没有,点击「编辑」→「添加」,把服务账户添加进去并赋予读取权限

额外提醒

  • 别浪费时间在「允许服务与桌面交互」上:Windows 7及以后的系统中,Session 0隔离机制让这个选项几乎没用,无法解决文件访问问题。
  • 对齐ChromeDriver和Chrome版本:版本不匹配会导致各种奇怪的兼容性问题,一定要保证两者版本完全一致。

内容的提问来源于stack exchange,提问作者Shoaib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:02:52