You may use Enabling Managed downloads by the Node. There are JAVA code examples in the documentation
Here is the C# code example.
It has extra references and may not be used right away. But it should give a general understanding of how to perform it in C#
public class SeleniumGridFileDownloadController
{
private readonly IDriverProvider _driverProvider;
private readonly SeleniumGridApiClient _apiClient;
public SeleniumGridFileDownloadController(IDriverProvider driverProvider, SeleniumGridApiClient apiClient)
{
_driverProvider = driverProvider;
_apiClient = apiClient;
}
public string[] GetCurrentFiles() => _apiClient.GetDownloadFiles(GetSessionId()).Value.Names;
public string DownloadFile(string downloadFileExtension, string downloadFolder, string[] previouslyDownloadedFiles, TimeSpan timeout)
{
var sessionId = GetSessionId();
var newFileName = WaitForNewFileWithExtension(sessionId, downloadFileExtension, previouslyDownloadedFiles, timeout);
var base64EncodedZippedContents = _apiClient.DownloadFile(sessionId, newFileName).Value.Contents;
return UnzipFileContent(base64EncodedZippedContents, downloadFolder);
}
private string UnzipFileContent(string base64EncodedZippedContents, string downloadFolder)
{
var zippedBytes = Convert.FromBase64String(base64EncodedZippedContents);
using var memoryStream = new MemoryStream(zippedBytes);
using var archive = new ZipArchive(memoryStream, ZipArchiveMode.Read);
var archiveEntry = archive.Entries.Single();
Directory.CreateDirectory(downloadFolder);
var entryDestinationPath = Path.Combine(downloadFolder, archiveEntry.FullName);
archiveEntry.ExtractToFile(entryDestinationPath, overwrite: true);
return entryDestinationPath;
}
private string WaitForNewFileWithExtension(string sessionId, string expectedExtension, string[] previouslyDownloadedFiles, TimeSpan timeout)
{
return new ConditionWaiter
{
Timeout = timeout,
Message = $"New {expectedExtension} file download"
}.Until(() =>
{
var newFiles = _apiClient.GetDownloadFiles(sessionId).Value.Names;
foreach (var newFile in newFiles)
{
if (!previouslyDownloadedFiles.Contains(newFile))
{
var fileInfo = new FileInfo(newFile);
if (fileInfo.Extension == expectedExtension)
{
return newFile;
}
}
}
return null;
});
}
private string GetSessionId() => GetDriver().SessionId.ToString();
private RemoteWebDriver GetDriver()
{
var driver = _driverProvider.GetDriver();
if (driver is not RemoteWebDriver remoteDriver)
{
throw new ArgumentException($"{nameof(RemoteWebDriver)} is expected but driver type is {driver.GetType().Name}");
}
return remoteDriver;
}
}
public class SeleniumGridApiClient : WebServiceClient
{
public SeleniumGridApiClient(ILogger log, string baseUri) : base(log, baseUri)
{
}
public SeleniumGridFileDownloadApiResponse DownloadFile(string sessionId, string fileName)
{
return NewRequest(Method.Post, $"session/{sessionId}/se/files")
.AddApplicationJsonBody(new SeleniumGridFileDownloadApiRequest()
{
Name = fileName
})
.AddHeader("X-REGISTRATION-SECRET", "")
.Execute()
.ShouldBeSuccess()
.Deserialize<SeleniumGridFileDownloadApiResponse>();
}
public SeleniumGridDownloadedFilesListApiResponse GetDownloadFiles(string sessionId)
{
return NewRequest(Method.Get, $"session/{sessionId}/se/files")
.AddHeader("X-REGISTRATION-SECRET", "")
.Execute()
.ShouldBeSuccess()
.Deserialize<SeleniumGridDownloadedFilesListApiResponse>();
}
}