Ожидание загрузки файла для firefox и chrome

Я не буду здесь рассматривать настройку профиля фаерфокс и хром для того, чтобы автоматически загружать файлы определенных расширений в заданную папку. Я покажу, как я ожидаю окончания процесса загрузки файла, когда уже пошел процесс.

       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 потока такого еще ни разу не произошло.

3 лайка

Весьма сомнительное и довольно запутанное решение.

1 лайк