selenium Java将文件.separator解析为%5c,这不是合法的文件路径

csga3l58  于 2023-01-09  发布在  Java
关注(0)|答案(1)|浏览(160)

我不确定它是什么时候开始的,但是我的Selenium框架不再接受File.separator的路径名,我必须使用反斜杠,否则我无法上传文件。
如果我输入路径如下:

String DOCX = "uploads" + File.separator + "mock" + File.separator + "document_donotparse.docx";

我得到这样一个错误:

invalid argument: File not found : C:\XXX\Arbeit\tests\build\resources\test\uploads%5cmock%5cdocument_donotparse.docx

基本上File.separator会转换为%5c
下面是我使用的代码:

public void uploadFiles(@NotNull List<String> filenames, By input, By progressBar, FileType fileType) {
        log.trace("Uploading files: {}", filenames);
        getExistingElement(input).sendKeys(Utils.parseFilenamesForMultipleUpload(filenames));
        throwIfParsingFailed(fileType);
        waitForAllElementsToDisappear(progressBar);
    }

由于我还需要一次上传多个文件,所以我需要util函数:

public String parseFilenamesForMultipleUpload(@NotNull Collection<String> filenames) {
        return String.join(" \n ", filenames
                .stream()
                .map(filename -> new File(Objects.requireNonNull(
                        Utils.class.getClassLoader().getResource(filename)).getFile()).getAbsolutePath())
                .toList());
    }

到目前为止,唯一起作用的基本上是修改代码,使用“正常”的反斜杠:

String DOCX = "uploads/mock/document_donotparse.docx";

但是,我希望再次使用File.separator
此外,我在阅读jsonproperties文件时完全没有问题,这些文件的路径也是用File.separator分隔的,所以问题一定出在上传代码的某个地方。

5lhxktic

5lhxktic1#

多亏了@hiren,我精确地指出了解析到%5c的地方是parseFilenamesForMultipleUpload,所以我添加了URLDecoder来去掉百分比,并创建了我自己的方法removePath来删除文件的路径部分,而不管文件分隔符的类型如何。
下面是代码:
parseFilenamesForMultipleUpload是非常相似的我只是添加了更多的Map,使它更干净,并通过decodeQuery方法添加了Map,它只是简单地转换百分比。

public String parseFilenamesForMultipleUpload(@NotNull Collection<String> filenames) {
        return filenames
                .stream()
                .map(Utils::getFile)
                .map(File::getPath)
                .map(Utils::decodeQuery)
                .collect(Collectors.joining("\n"));
    }

Utils#getFile只是从先前版本的parseFilenamesForMultipleUpload方法中提取的一些代码,以便于说明:

@Contract("_ -> new")
    private @NotNull File getFile(String filename) {
        return new File(Objects.requireNonNull(Utils.class.getClassLoader().getResource(filename)).getFile());
    }

然后我用File#getPath代替之前的File#AbsolutePath再次Map它,最后decodeQuery转换百分比样式。
Utils#decodeQuery

public String decodeQuery(String query) {
        return URLDecoder.decode(query, StandardCharsets.UTF_8);
    }

最后我用一个换行符加入它们。
然后,为了能够从文件路径中提取文件名,我创建了这样的方法:

public String removePath(@NotNull String filepath) {
        for (char c : new char[]{'/', '\\', File.separatorChar, File.pathSeparatorChar}) {
            filepath = cutFilePath(filepath, c);
        }
        return filepath;
    }

其中cutFilePath为:

private @NotNull String cutFilePath(@NotNull String filepath, char delimiter) {
        int charIndex = filepath.lastIndexOf(delimiter);
        return charIndex > -1 ? filepath.substring(charIndex + 1) : filepath;
    }

一切正常:)

相关问题