1

Seleniumを使用してサイトから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 が保存されたファイルを開くことができないことです。

ファイルを正しく保存するにはどうすればよいですか?

4

2 に答える 2

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();
}
于 2012-10-03T20:34:14.517 に答える
0

文字をバイトストリームに再エンコードするために使用することもできますがString.getBytes()、それでもおそらくうまくいきません。

基本的に、Excel ファイルのバイナリ データを文字列に保持するには、文字セットを使用してデータをデコードする必要があります。Excel ファイルはプレーン テキストとして読み取られることが想定されていないため、有効な文字エンコーディングではないバイト シーケンスが多数存在する可能性があります。これらのバイト シーケンスは、デコードされるStringと、おそらく単に「?」として表されます。(ただし、これはCharset実際に使用されている によって異なります)。String.getBytes()または他の方法を使用して文字を再エンコードしようとすると、 「?」文字は元のバイトに変換されずに、Unicode の疑問符文字のエンコーディングに変換されますが、これは Excel ファイル形式ではほぼ確実に有効ではありません。

問題は、なぜこのファイルを Se からダウンロードする必要があるのか​​ということです。Se は、ブラウザーが Web ページをレンダリングする方法をテストすることに関するものです。Excel ファイルが必要な場合は、Se でクリックしているリンクから href を取得HttpUrlConnectionし、標準のバイナリを使用して簡単にファイルをダウンロードしてみInputStreamませんか?

于 2012-10-03T15:13:43.977 に答える