Я не буду здесь рассматривать настройку профиля фаерфокс и хром для того, чтобы автоматически загружать файлы определенных расширений в заданную папку. Я покажу, как я ожидаю окончания процесса загрузки файла, когда уже пошел процесс.
public String waitForFileToBeDownloaded(List<String> files, String directoryPath, String extension) {
String part;
switch (driverType) {
case CHROME:
part = "crdownload";
break;
case FIREFOX:
part = "part";
break;
default: throw new AppException("todo");
}
final FilenameFilter filter = getFilenameFilter(extension, part);
String filePath = new WebDriverWait(this, <timeOutInSeconds>L).until(CustomExpectedConditions.newFilePresence(files, directoryPath, filter));
if (filePath.endsWith(part)) {
filePath = filePath.replace("." + part, "");
}
try {
File testFile = new File(directoryPath + filePath);
File testFileTemp = new File(testFile.getAbsolutePath() + "." + part);
while (testFileTemp.exists()) {
TimeUnit.SECONDS.sleep(Timeout.defaultTimeout);
}
TimeUnit.SECONDS.sleep(Timeout.action);
} catch (Exception e) {/**/}
return filePath;
}
при этом ожидание появления нового файла в папке реализовано так
public static ExpectedCondition<String> newFilePresence(final List<String> files, final String directoryPath, final FilenameFilter filter) {
return new ExpectedCondition<String>() {
@Override
public String apply(org.openqa.selenium.WebDriver driver) {
List<String> filesAfterDownloading = new ArrayList<>();
String[] files_ = new File(directoryPath).list(filter);
if (files_ != null) {
filesAfterDownloading.addAll(Arrays.asList(files_));
}
if (files != null) {
filesAfterDownloading.removeAll(files);
}
if (filesAfterDownloading.size() > 0) {
return filesAfterDownloading.get(0);
} else {
return null;
}
}
@Override
public String toString() {
return "new file presence in the folder " + directoryPath;
}
};
}
Так полностью процесс скачивания файла происходит следующим образом:
List<String> files = Arrays.asList(new File(<directoryPath>).list(getFilenameFilter(<fileExtension>)));
findElement(<link for download>).click();
String filePath = waitForFileToBeDownloaded(files, <directoryPath>, <expectedFileExtension>);
Есть конечно один момент, если два теста совершенно одновременно начали загрузку файла, может возникнуть конфликт, но на практике, в 3 потока такого еще ни разу не произошло.