2012-10-03 80 views
1

我想从网站下载使用硒的Excel文件。保存从互联网的excel文件

我做它的方式:

WebElement excelList = driver.findElement(By.xpath("...")); 

    excelList.click(); 

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 

    String pageSource = driver.getPageSource(); 
    FileOutputStream fos = new FileOutputStream("d:/load.xls"); 

    for (int i = 0; i < pageSource.length(); i++) { 
     char c = pageSource.charAt(i); 


     fos.write((byte) c); 
    } 

    fos.close(); 

页源字符串长度等于我手动下载了这个网站的文件大小。

问题是我错误地保存数据和MS Excel无法打开保存的文件。

如何正确保存文件?

回答

0

我想通了。

我只需要点击加载文件按钮后从最后一页获取输入流。 但获取页面对象'lastPage()'的方法已保护访问权限。

这里是这样的:

private static void saveExcelFile(HtmlUnitDriver driver) { 
    Method m = driver.getClass().getDeclaredMethod("lastPage", null); 
    m.setAccessible(true); 
    Object obj = m.invoke(driver, null); 

    Page page = (Page) obj; 

    InputStream stream = page.getWebResponse().getContentAsStream(); 

    FileOutputStream fos = new FileOutputStream("d:/load.xls"); 

    int c; 

    while ((c = stream.read()) != -1) { 
     fos.write(c); 
    } 

    fos.close(); 
} 
0

你可以尝试使用String.getBytes()来重新编码字符到字节流,但可能仍然不会工作。

基本上,为了将excel文件的二进制数据保存在字符串中,必须使用字符集对数据进行解码。因为excel文件不应该被看作纯文本,所以可能有很多字节序列是无效的字符编码。这些字节序列在解码为String时可能仅表示为'?' (尽管这取决于实际上正在使用的Charset)。当您尝试使用String.getBytes()或其他任何方法重新编码字符'?'字符不会转换回原始字节,而是转换为unicode问号字符的编码,这对于excel文件格式几乎肯定无效。

真正的问题是,为什么你需要通过Se下载这个文件? Se是关于测试浏览器如何呈现网页的。如果你需要Excel文件,为什么不直接从链接中获取href点击Se,然后使用简单的HttpUrlConnection来使用标准二进制文件下载文件InputStream

+0

那么,是由执行Java脚本生成的excel文件,我只是不知道准确链接到最后的URL。我正在开发的解决方案是为了在网站上行走并收集数据,有时还要下载文件。按照Selenuim允许的方式获取数据似乎更容易 – Oleg