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
相关产品推荐
相关产品推荐

