用java测试文件下载

用java测试文件下载,java,multithreading,file,selenium,download,Java,Multithreading,File,Selenium,Download,我必须使用Selenium测试web应用程序。 应用程序有一个用于下载文件的链接。 我已经设置了一个Firefox配置文件,以便浏览器在不要求确认的情况下下载文件。我的(简化的)Java代码如下: File file = new File("myPath"); driver.findElement(By.id("file-link-download-")).click(); // the download start here // my test if(!fil

我必须使用Selenium测试web应用程序。 应用程序有一个用于下载文件的链接。 我已经设置了一个Firefox配置文件,以便浏览器在不要求确认的情况下下载文件。我的(简化的)Java代码如下:

    File file = new File("myPath");
    driver.findElement(By.id("file-link-download-")).click(); // the download start here
    // my test
    if(!file.exists()) fail("file does not exist"); 
我的问题是下载在另一个线程中运行,当执行“我的测试”(if file.exists())时,文件尚未下载。我可以用一种延迟的方法来包装它,比如:

public boolean fileExists(File file) {

    try {// Just wait 1000 milliseconds to see if the file exists
        Thread.sleep(sleep);
    } catch (InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
    if (file.exists()) {
        return true;
            }
    } catch (InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
   return false;
}
但这是不够的。我认为最好的方法应该是使用一个带有超时的单独线程,该线程监视文件是否已下载,然后返回true,如果存在超时,则返回false

处理这个问题的最佳方法(正确方法)是什么


谢谢

FluentWait类是为这种情况而设计的。我注意到你只是,基本上,试图复制在这门课上已经做过的事情

以下是它的来源:

它非常通用,因此可以处理各种不同的情况-包括您的情况

您只需检查
apply
方法中的
file.exists()
,如示例文档所示:


你看过这篇文章了吗?是的,我知道这篇文章。但这不是我的情况。无论如何,感谢链接
FluentWait
就是为了这个而设计的……它是通用的,因此支持这种东西……你只是在复制代码。。。。从@jbx发布的链接来看:你打算对下载的文件做什么?如果你的答案是空的,那你为什么要下载呢?生成下载文件的servlet应该单独进行单元测试。使用任何浏览器自动化框架只需单击一个链接并查看它是否下载了一个文件,这并不是验证链接是否不可用的最便宜的方法404-有更便宜的方法验证这一点。如果在Chrome inspector中打开“网络”选项卡,单击DIV元素时,您将看到触发了什么直接链接来下载文件。仅使用浏览器测试绝对需要浏览器的内容。在更小、更合适的单元测试中测试所有其他内容。