2013-02-28 108 views
0

本周我主持了一个作业,并在这个论坛上阅读,我发现我的问题的“解决方案”。 我的程序解析一个网站的HTML页面并获取一些数据。这并不难。我的问题是如何获取网站上的数据。 使用的HtmlUnit我知道这是可能的,并阅读他们的教程和一些代码在网络上,我写我简单的测试:提交按钮上的HtmlUnit点击事件不起作用

import org.junit.Test; 

import com.gargoylesoftware.htmlunit.WebClient; 
import com.gargoylesoftware.htmlunit.html.HtmlForm; 
import com.gargoylesoftware.htmlunit.html.HtmlPage; 
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput; 

public class MyTest { 

    @Test 
    public void myClient() throws Exception { 

    final WebClient webClient = new WebClient(); 

    HtmlPage page = webClient.getPage("http://www.atb.bergamo.it/ITA/Default.aspx?SEZ=2&PAG=38&MOD=LINTRV"); 

    final HtmlForm form = page.getFormByName("form1"); 

    final HtmlSubmitInput filtra = form.getInputByName("ctl13$btnFilter"); 

    page = filtra.click(); 

    final String pageAsXml = page.asXml(); 

    System.out.println(pageAsXml); 

    webClient.closeAllWindows(); 
    } 
} 

此代码获取远程页面,在页面的后一种形式点击提交按钮在控制台上打印提交结果。

问题是当我使用click事件时,因为网页没有任何变化。 Infact它必须出现一个包含我想要收集的一些数据的新表格,但它没有。

你能告诉我哪里出错了吗?

你知道另一种方法去做我想做的事吗?

回答

0

看起来好像这段代码抛出一个加载初始页面的异常(特别是执行JavaScript)。 从我的经验来看,这并不罕见,可以归因于HtmlUnit的JavaScript引擎(Rhino)。

我会建议尝试Selenium WebDriver。

此代码应该得到的页面的源代码:

package javaapplication1; 

import java.util.List; 
import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.support.ui.ExpectedCondition; 
import org.openqa.selenium.support.ui.WebDriverWait; 

public class Selenium { 
    public static void main(String[] args) throws InterruptedException { 
     WebDriver driver = new FirefoxDriver(); 

     driver.get("http://www.atb.bergamo.it/ITA/Default.aspx?SEZ=2&PAG=38&MOD=LINTRV"); 
     WebElement filtra = driver.findElement(By.name("ctl13$btnFilter")); 
     filtra.click(); 
     //make sure to wait till the results div is loaded 
     //waits 10 seconds or then throws an exception 
     (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() { 
      public Boolean apply(WebDriver d) { 
       List<WebElement> divTags = d.findElements(By.tagName("div")); 
       for(WebElement tag: divTags){ 
        if(tag.getAttribute("id").equalsIgnoreCase("ctl13_divRisultati")){ 
         return true; 
        } 
       } 
       return false; 
      } 
     }); 
     String pageSource = driver.getPageSource(); 
     System.out.println(pageSource); 
     driver.quit(); 
    } 
}