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

Docker容器无法找到内部创建的文件问题求助

Docker容器中Selenium上传文件找不到本地创建文件的解决思路

问题重现

用C#编写脚本创建两个文本文件,尝试通过Selenium的SendKeys实现网站附件上传,代码如下:

TextWriter tw = new StreamWriter(getProjectDirectory() + "/data.txt",true);
TextWriter tw2 = new StreamWriter(getProjectDirectory() + "/data2.txt", true);

string data1 = getProjectDirectory() + "/data.txt";
string data2= getProjectDirectory() + "/data2.txt";

addAttachmentInput.SendKeys(data1);
addAttachmentInput.SendKeys(data2); 

执行到addAttachmentInput.SendKeys(data1)时失败,报错:

dotnet6sdk_1 | OpenQA.Selenium.WebDriverArgumentException : invalid argument: File not found : /src/TestProject/data.txt


解决思路

1. 确保文件完全写入磁盘

StreamWriter默认采用缓冲写入,若未显式关闭或刷新,文件可能仅存在于内存中,未真正写入磁盘。修改代码时用using语句自动释放资源(会触发Flush并关闭文件),同时用Path.Combine避免跨平台路径分隔符问题:

// 创建并确保文件写入磁盘
using (TextWriter tw = new StreamWriter(Path.Combine(getProjectDirectory(), "data.txt"), true))
{
    tw.WriteLine(""); // 写入空内容触发磁盘写入,若需实际内容替换此处
}
using (TextWriter tw2 = new StreamWriter(Path.Combine(getProjectDirectory(), "data2.txt"), true))
{
    tw.WriteLine("");
}

string data1 = Path.Combine(getProjectDirectory(), "data.txt");
string data2 = Path.Combine(getProjectDirectory(), "data2.txt");

// 可选:先验证文件存在再执行上传
if (File.Exists(data1))
{
    addAttachmentInput.SendKeys(data1);
}
else
{
    throw new FileNotFoundException("data.txt未找到", data1);
}
if (File.Exists(data2))
{
    addAttachmentInput.SendKeys(data2);
}
else
{
    throw new FileNotFoundException("data2.txt未找到", data2);
}

2. 检查Docker容器内的路径与权限

  • 确认getProjectDirectory()返回的/src/TestProject/目录在容器内真实存在,且运行脚本的用户拥有该目录的读写权限。
  • 若使用独立的浏览器容器(如selenium/standalone-chrome),需将测试代码的文件目录同步挂载到浏览器容器中——因为浏览器驱动运行在容器内,必须能访问到目标文件。示例Docker Compose配置:
    services:
      test-service:
        volumes:
          - ./src/TestProject:/src/TestProject
      selenium-chrome:
        volumes:
          - ./src/TestProject:/src/TestProject # 同步挂载目录,让驱动能读取文件
    
  • 若文件权限不足,可手动设置可读权限:
    File.SetAttributes(data1, FileAttributes.Normal);
    // 或针对Linux容器设置更宽松的权限
    new FileInfo(data1).Permissions = FilePermissions.ReadOwner | FilePermissions.ReadGroup | FilePermissions.ReadOther;
    

3. 适配远程WebDriver的文件访问上下文

如果是连接Docker中的Selenium Grid节点,测试代码容器与浏览器节点容器的文件系统是隔离的,此时可以:

  • 使用LocalFileDetector自动上传本地文件到远程节点:
    ((IHasFileDetector)addAttachmentInput).FileDetector = new LocalFileDetector();
    addAttachmentInput.SendKeys(data1);
    
    该类会自动将本地文件上传到远程节点,再使用远程路径完成上传操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:15:37