[英]In Java and HtmlUnit, how to wait for a resulting page to finish loading and download it as HTML?
HtmlUnit是一個很棒的Java庫,可讓您以編程方式填寫和提交Web表單。 我目前正在維護一個用ASP編寫的相當老的系統,而不是按需每月手動填寫一份Web表單,而是嘗試尋找一種方法來使整個任務自動化,因為我一直忘記它。 這是一種檢索一個月內收集的數據的表格。 到目前為止,這是我編寫的代碼:
WebClient client = new WebClient();
HtmlPage page = client.getPage("http://urlOfTheWebsite.com/search.aspx");
HtmlForm form = page.getFormByName("aspnetForm");
HtmlSelect frMonth = form.getSelectByName("ctl00$cphContent$ddlStartMonth");
HtmlSelect frDay = form.getSelectByName("ctl00$cphContent$ddlStartDay");
HtmlSelect frYear = form.getSelectByName("ctl00$cphContent$ddlStartYear");
HtmlSelect toMonth = form.getSelectByName("ctl00$cphContent$ddlEndMonth");
HtmlSelect toDay = form.getSelectByName("ctl00$cphContent$ddlEndDay");
HtmlSelect toYear = form.getSelectByName("ctl00$cphContent$ddlEndYear");
HtmlCheckBoxInput games = form.getInputByName("ctl00$cphContent$chkListLottoGame$0");
HtmlSubmitInput submit = form.getInputByName("ctl00$cphContent$btnSearch");
frMonth.setSelectedAttribute("1", true);
frDay.setSelectedAttribute("1", true);
frYear.setSelectedAttribute("2012", true);
toMonth.setSelectedAttribute("1", true);
toDay.setSelectedAttribute("31", true);
toYear.setSelectedAttribute("2012", true);
games.setChecked(true);
submit.click();
在click()
,我應該等待完全相同的網頁完成重新加載,因為某處有一個表,顯示我的搜索結果。 然后,當頁面加載完成后,我需要將其下載為HTML文件(非常類似於您喜歡的瀏覽器中的“頁面另存為...”),因為我將抓取數據以計算其總和,我已經使用Jsoup庫做到了。
我的問題是:1.如何以編程方式等待網頁完成在HtmlUnit中的加載? 2.如何以編程方式將生成的網頁下載為HTML文件?
我已經研究過HtmlUnit文檔,找不到適合我需要的類。
嘗試以下設置:
webClient.waitForBackgroundJavaScript() or
webClient.waitForBackgroundJavaScriptStartingBefore()
我認為您也需要提及瀏覽器,默認情況下它使用的是IE,您將在此處獲得更多信息。 HTMLUnit不等待Javascript
這個例子可能對您有幫助。 單擊后,您需要等待頁面加載。 大多數情況下,它是一個使用Java腳本等的動態頁面。所有重寫的方法都不會使您收到大量的控制台消息。 您可以實現所需的一種。
public static void main(String[] args) throws IOException {
WebClient webClient = gethtmlUnitClient();
final HtmlPage page = webClient.getPage("YOUR PAGE");
webClient.waitForBackgroundJavaScript(60000);
System.out.println(page);
}
static public WebClient gethtmlUnitClient() {
WebClient webClient;
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF);
java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF);
webClient = new WebClient(BrowserVersion.CHROME);
webClient.setIncorrectnessListener(new IncorrectnessListener() {
@Override
public void notify(String arg0, Object arg1) {
}
});
webClient.setCssErrorHandler(new ErrorHandler() {
@Override
public void warning(CSSParseException arg0) throws CSSException {
// TODO Auto-generated method stub
}
@Override
public void fatalError(CSSParseException arg0) throws CSSException {
// TODO Auto-generated method stub
}
@Override
public void error(CSSParseException arg0) throws CSSException {
// TODO Auto-generated method stub
}
});
webClient.setJavaScriptErrorListener(new JavaScriptErrorListener() {
@Override
public void timeoutError(HtmlPage arg0, long arg1, long arg2) {
// TODO Auto-generated method stub
}
@Override
public void scriptException(HtmlPage arg0, ScriptException arg1) {
// TODO Auto-generated method stub
}
@Override
public void malformedScriptURL(HtmlPage arg0, String arg1, MalformedURLException arg2) {
// TODO Auto-generated method stub
}
@Override
public void loadScriptError(HtmlPage arg0, URL arg1, Exception arg2) {
// TODO Auto-generated method stub
}
});
webClient.setHTMLParserListener(new HTMLParserListener() {
@Override
public void warning(String arg0, URL arg1, String arg2, int arg3, int arg4, String arg5) {
// TODO Auto-generated method stub
}
@Override
public void error(String arg0, URL arg1, String arg2, int arg3, int arg4, String arg5) {
// TODO Auto-generated method stub
}
});
webClient.getOptions().setThrowExceptionOnScriptError(false);
return webClient;
}
如何以編程方式將生成的網頁下載為HTML文件
嘗試asXml()
。 就像是:
page = submit.click();
String htmlContent = page.asXml();
File htmlFile = new File("C:/index.html");
PrintWriter pw = new PrintWriter(htmlFile, true);
pw.print(htmlContent);
pw.close();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.