12

Web サイトの xls ファイルをダウンロードしようとしています。リンクをクリックしてファイルをダウンロードすると、JavaScript の確認ボックスが表示されます。以下のように処理します

    ConfirmHandler okHandler = new ConfirmHandler(){
            public boolean handleConfirm(Page page, String message) {
                return true;
            }
        };
    webClient.setConfirmHandler(okHandler);

ファイルをダウンロードするリンクがあります。

<a href="./my_file.php?mode=xls&amp;w=d2hlcmUgc2VsbElkPSd3b3JsZGNvbScgYW5kIHN0YXR1cz0nV0FJVERFTEknIGFuZCBkYXRlIDw9IC0xMzQ4MTUzMjAwICBhbmQgZGF0ZSA%2BPSAtMTM1MDgzMTU5OSA%3D" target="actionFrame" onclick="return confirm('Do you want do download XLS file?')"><u>Download</u></a>

を使用してリンクをクリックします

HTMLPage x = webClient.getPage("http://working.com/download");
HtmlAnchor anchor = (HtmlAnchor) x.getFirstByXPath("//a[@target='actionFrame']");
anchor.click();

handeConfirm() メソッドが実行されます。しかし、サーバーからファイル ストリームを保存する方法がわかりません。以下のコードでストリームを見てみました。

anchor.click().getWebResponse().getContentAsString();

ただし、結果はページ x と同じです。サーバーからストリームをキャプチャする方法を知っている人はいますか? ありがとうございました。

4

6 に答える 6

10

WebWindowListener を使用して InputStream を取得する方法を見つけました。webWindowContentChanged(WebWindowEvent イベント) 内に、以下のコードを配置します。

InputStream xls = event.getWebWindow().getEnclosedPage().getWebResponse().getContentAsStream();

xls を取得したら、ファイルをハード ディスクに保存できました。

于 2012-10-22T23:56:06.730 に答える
3

HtmlUnit を Selenium でラップしたくない場合は、もっと簡単な方法があります。HtmlUnit の WebClient に拡張された WebWindowListener を提供するだけです。

Apache commons.io を使用してストリームを簡単にコピーすることもできます。

WebClient webClient = new WebClient();
webClient.addWebWindowListener(new WebWindowListener() {
    public void webWindowOpened(WebWindowEvent event) { }

    public void webWindowContentChanged(WebWindowEvent event) {
        // Change or add conditions for content-types that you would
        // to like receive like a file.
        if (response.getContentType().equals("text/plain")) {
            try {
                IOUtils.copy(response.getContentAsStream(), new FileOutputStream("downloaded_file"));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    public void webWindowClosed(WebWindowEvent event) {}
});
于 2015-09-30T21:37:42.673 に答える