【问题标题】:Why doesn't my web start application finds existing files?为什么我的 Web 启动应用程序找不到现有文件?
【发布时间】:2012-06-25 09:40:44
【问题描述】:

我们使用 Jenkins-Slave 来执行 Selenium Gui 测试。从站使用 WebStart 启动并在 Windows 7 机器上运行。该测试包含下载 PDF 文件,应通过查找其中的文本来检查其是否存在以及正确性。问题是,正在运行的 Selenium 测试看不到 firefox 下载的文件。实际上该进程似乎没有在目录中看到任何文件。

如果我在本地机器上直接从 IDE 执行测试,而不是使用 Jenkins 或 WebStart,测试运行得很好。

我已经考虑过以下几点:

  • 我是否检查了错误的目录?不,我将file.getAbsolutePath() 复制到Windows 资源管理器并可以看到这些文件。我也很确定我在正确的机器上。
  • 这是时间问题吗?例如。文件没有下载完成吗?不,我使用 WebDriverWait 并等待 30 秒来查找文件,而实际上创建和下载 PDF 需要大约 1 秒:

    WebDriverWait wait = new WebDriverWait(driver, 30, 1000);
       wait.until(new Predicate<WebDriver>(){
         public boolean apply(WebDriver driver){
           try{
             log.info("file: " + pdfFile.getAbsolutePath() + ", exists: " + pdfFile.exists() + ", size: " + pdfFile.length());
             // test files content ...
           }
           catch (IOException e){
             return false;
           }
         }
       });
    

有没有人知道可能出了什么问题?欢迎大胆猜测......

更新 我检查了 jenkins.jnlp 文件,它包含“所有权限”,因此它应该能够访问文件系统。

<security>
   <all-permissions/>
</security>

更新 2 为了清楚起见:我使用 Jenkins 运行 Selenium 测试。 Selenium 远程控制 Firefox,同时下载 PDF 文件。问题是,Java 进程,例如我的测试类找不到文件。

【问题讨论】:

  • 我接受,WebStart 的sandbox 设置允许下载。 如果是这样:记录的 pdfFile 路径是否正确?存在总是假的吗? pdfFile.canRead() 怎么样? (通常我的猜测是系统属性 user.dir 在 IDE 和独立版本中有所不同。)
  • 我认为这不是问题。 Jenkins Slaves 包含所有权限(更新了我的问题以明确这一点),我认为如果由于缺少权限而无法访问该目录,我会得到一个异常。 user.dir 也是一个合理的猜测,但是,当我记录 file.getAbsolutePath 时,它应该是正确的。无论两台机器上是否不同。
  • 你在用PersistenceService;看到here for an example?使用 FileContents i.o.文件。罐子签名我也会这样做。
  • 我认为你弄错了@JoopEggen。我不使用 WebStart 应用程序来存储文件。 WebStart 用于启动 Jenkins-Slave。该从站执行 Selenium 测试,该测试驱动 Firefox,从而使用 Firefox 生成和下载 PDF 文件。我更新了我的问题以明确这一点。

标签: java windows jenkins java-web-start


【解决方案1】:

您如何在 Windows 7 上运行 Jenkins?您是否将其安装为服务?你检查过这个常见问题列表吗? https://wiki.jenkins-ci.org/display/JENKINS/My+software+builds+on+my+computer+but+not+on+Jenkins

【讨论】:

  • 谢谢,这份清单似乎很有帮助。但是,我们没有将它安装为 Windows 服务,而是使用 WebStart 启动它。
【解决方案2】:

改变我的相对路径:

new File("downloads/");

通过调用“getAbsoluteFile”或只使用“C:...”:

new File("downloads/").getAbsoluteFile();

修复了问题(但我不明白为什么)。这是因为 Jenkins 设置了 user.id 并且由于 java.io.File 实现中的错误,这可能会导致问题。请参阅this other SO questionthis Java bug report

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多