2012-10-03 3 views
1

Selenium을 사용하여 사이트에서 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()을 사용하여 문자를 다시 바이트 스트림으로 다시 정렬 할 수는 있지만 그래도 작동하지 않을 수도 있습니다.

기본적으로 문자열에 엑셀 파일의 바이너리 데이터를 저장하려면 데이터를 문자 집합을 사용하여 디코딩해야합니다. 엑셀 파일은 일반 텍스트로 읽히지 않기 때문에 유효한 문자 인코딩이 아닌 많은 바이트 시퀀스가있을 수 있습니다. String으로 디코드 될 때 이러한 바이트 시퀀스는 '?'로 표시됩니다. (비록 이것은 실제로 사용되는 Charset에 달려 있지만). String.getBytes() 또는 다른 방법을 사용하여 문자를 다시 인코딩하려고하면 '?' 문자는 원래 바이트로 다시 변환되지 않고 오히려 Excel 파일 형식에 유효하지 않은 유니 코드 물음표 문자의 인코딩으로 변환됩니다.

진짜 질문은 왜 Se를 통해이 파일을 다운로드해야합니까? Se는 브라우저가 웹 페이지를 렌더링하는 방법을 테스트하는 것에 관한 것입니다. Excel 파일이 필요한 경우 Se에서 클릭하는 링크에서 href를 가져 오지 않고 간단한 HttpUrlConnection을 사용하여 표준 바이너리 InputStream을 사용하여 파일을 다운로드 할 수 있습니까?

+0

음, 엑셀 파일은 자바 스크립트를 실행하여 생성되고 난 그냥 최종 URL에 대한 정확한 링크를 모르는 : 여기

는 방법입니다. 제가 개발중인 솔루션은 사이트를 방문하여 데이터를 수집하고 때로는 파일을 다운로드하기위한 것입니다. Selenuim이 허용하는 방식으로 데이터를 얻는 것이 더 쉬워 진 것 같습니다. – Oleg

관련 문제