0

今週、私は宿題を始め、このフォーラムを読んで、私の問題の「解決策」を見つけました。私のプログラムは、Web サイトの HTML ページを解析し、いくつかのデータを取得します。これは難しいことではありません。私の問題は、ウェブサイトでデータを取得する方法です。HtmlUnit を使用して、それが可能であることを知っており、チュートリアルと Web 上のいくつかのコードを読んで、簡単なテストを作成しました。

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();
  }
}

このコードは、リモート ページを取得し、ページのフォームで送信ボタンをクリックしてから、送信結果をコンソールに出力します。

問題は、Web ページで何も変更されないため、クリック イベントを使用する場合です。実際、収集したいデータを含む新しいテーブルが表示される必要がありますが、そうではありません。

どこが間違っているのか教えてください。

私がやりたいことを行う別の方法を知っていますか?

4

1 に答える 1

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();
    }
}
于 2013-03-04T15:30:58.090 に答える