提交按钮上的HtmlUnit点击事件不起作用

时间:2013-02-28 19:01:49

标签: java htmlunit

本周我在一个家庭作业和阅读这个论坛上找到了解决问题的“解决方案”。 我的程序解析网站的HTML页面并获取一些数据。这不难。我的问题是如何在网站上获取数据。 使用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事件时,因为网页中没有任何变化。 事实上,它必须出现一个新表,其中包含我想要收集的一些数据,但事实并非如此。

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

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

1 个答案:

答案 0 :(得分: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();
    }
}