2011-11-08 10 views
4

JavaのHtmlUnitにこの奇妙な問題があります。 - ログインファイルをダウンロードした後、HtmlUnitはページを取得できません。

2 - 各要素について(車)用

----- 3件の検索

1:私はウェブサイトからいくつかのデータをダウンロードするためにそれを使用しています、このプロセスは、このようなものですリンクから車

----- 4ダウンロードzipファイル

コード:

Webクライアントの

作成:

webClient = new WebClient(BrowserVersion.FIREFOX_3_6); 
webClient.setJavaScriptEnabled(true); 
webClient.setThrowExceptionOnScriptError(false); 
DefaultCredentialsProvider provider = new DefaultCredentialsProvider(); 
provider.addCredentials(USERNAME, PASSWORD); 
webClient.setCredentialsProvider(provider); 
webClient.setRefreshHandler(new ImmediateRefreshHandler()); 

ログイン:ウェブサイトでの車のための

public void login() throws IOException 
    { 
    page = (HtmlPage) webClient.getPage(URL); 
    HtmlForm form = page.getFormByName("formLogin"); 

    String user = USERNAME; 
    String password = PASSWORD; 

    // Enter login and password 
    form.getInputByName("LoginSteps$UserName").setValueAttribute(user); 
    form.getInputByName("LoginSteps$Password").setValueAttribute(password); 

    // Click Login Button 
    page = (HtmlPage) form.getInputByName("LoginSteps$LoginButton").click(); 

    webClient.waitForBackgroundJavaScript(3000); 

    // Click on Campa area 
    HtmlAnchor link = (HtmlAnchor) page.getElementById("ctl00_linkCampaNoiH"); 
    page = (HtmlPage) link.click(); 

    webClient.waitForBackgroundJavaScript(3000); 
    System.out.println(page.asText()); 
    } 

検索:

private void searchCar(String _regNumber) throws IOException 
{ 
// Open search window 
page = page.getElementById("search_gridCampaNoi").click(); 

webClient.waitForBackgroundJavaScript(3000); 

// Write plate number 
HtmlInput element = (HtmlInput) page.getElementById("jqg1"); 
element.setValueAttribute(_regNumber); 

webClient.waitForBackgroundJavaScript(3000); 

// Click on search 
HtmlAnchor anchor = (HtmlAnchor) page.getByXPath("//*[@id=\"fbox_gridCampaNoi_search\"]").get(0); 
page = anchor.click(); 

webClient.waitForBackgroundJavaScript(3000); 
System.out.println(page.asText()); 
} 

ダウンロードPDF:

try 
    { 
     InputStream is = _link.click().getWebResponse().getContentAsStream(); 
     File path = new File(new File(DOWNLOAD_PATH), _regNumber); 
     if (!path.exists()) 
     { 
     path.mkdir(); 
     } 
     writeToFile(is, new File(path, _regNumber + "_pdfs.zip")); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    } 

問題は:

最初の車は大丈夫働く、PDFファイルがダウンロードされますが、できるだけ早く私は新しい車を探して、私はこの行を取得する場合:

page = page.getElementById("search_gridCampaNoi").click(); 

が、私はこの例外を取得:

InputStream is = _link.click().getWebResponse().getContentAsStream(); 
0:

Exception in thread "main" java.lang.ClassCastException: com.gargoylesoftware.htmlunit.UnexpectedPage cannot be cast to com.gargoylesoftware.htmlunit.html.HtmlPage 

デバッグした後、私は今、私はこの呼び出しを行うことを実現しました

戻り値の型はpage.getElementById( "search_gridCampaNoi")です.Click()はHtmlPageからWebResponseに変更されるため、新しいページを受け取る代わりに、既にダウンロードしたファイルを再度受け取ります。

この状況を示すデバッガのスクリーンショットのカップル:

まず呼び出し、戻り値の型のOK:

enter image description here

第二に呼び出し、戻り値の型が変更されていないと私はもはやHTMLページのを受け取る:

enter image description here

ありがとうございます!

答えて

8

誰かが同じ問題に遭遇した場合、私は回避策を見つけました。ライン変更:

InputStream is = _link.openLinkInNewWindow().getWebResponse().getContentAsStream(); 

InputStream is = _link.click().getWebResponse().getContentAsStream(); 

することはトリックを行うようです。私は今何かを持っているが、いくつかの反復をしているときに問題を抱えている。

関連する問題