2012-10-03 106 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