2

HtmlUnit を使用して HTML フォームに入力して送信しようとしています。1 つのselect要素とそのオプションは、 を使用してロードされます<body onLoad="...">

私の問題: org.apache.http.wireログselectを見ると、データがロードされていることがわかりますが、getSelectByName、getChildElements などでこの要素を取得できません(ElementNotFoundException がスローされます)。

を印刷page.asXml()すると、変更されていない HTML ドキュメントしか表示されません。

私のコード:

public static void main(final String[] args) throws Exception {

    final URL url = new URL("http://www.rce-event.de/modules/meldung/annahme.php?oid=471&pid=1&ac=d98482bbf174f62eaaa4664c&tkey=468&portal=www.dachau.de&ortsbox=1&callpopup=1");

    final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6); // tried also FIREFOX_3
    webClient.setAjaxController(new NicelyResynchronizingAjaxController());

    final HtmlPage page = webClient.getPage(url);
    webClient.waitForBackgroundJavaScript(10000); // tried also Thread.sleep()

    // tried also to use webClient.getCurrentWindow().getEnclosedPage() instead of 'page'
    final HtmlForm form = page.getFormByName("formular");

    // ElementNotFoundException thrown here:
    final HtmlSelect select = form.getSelectByName("event.theme");
    final HtmlOption option = select.getOptionByText("Sport/Freizeit");
    final Page newPage = select.setSelectedAttribute(option, false);

    // submit etc.
}

スタックトレース:

Exception in thread "main" com.gargoylesoftware.htmlunit.ElementNotFoundException: elementName=[select] attributeName=[name] attributeValue=[event.theme]
at com.gargoylesoftware.htmlunit.html.HtmlForm.getSelectByName(HtmlForm.java:449)
at Xyzzy.main(Xyzzy.java:58)

herehere、およびhere (さらにそれ以上) に書かれているすべてを試しましたが、成功しませんでした。

アップデート:

コードを簡素化し、報奨金を開始しました。

4

1 に答える 1

2

あなたの問題は、「event.datapool」という名前の選択が選択されたときに「1」の値を持つ場合にのみ、「event.theme」という名前の選択がロードされることです。

したがって、「event.datapool」選択値を「1」に変更する必要があります。

[........]
final HtmlSelect selectBase = form.getSelectByName("event.datapool");
final HtmlOption optionBase = selectBase.getOptionByText("Freizeit / Tourismus");
final Page newPage = selectBase.setSelectedAttribute(optionBase, true);
[........]

ただし、選択した「event.theme」の「HTML」データが ajax 経由で読み込まれるため、問題が発生する可能性があります。したがって、Javascriptが実際のユーザーインタラクションで行うように、Java「HtmlSelect」クラスが選択した「event.theme」をフォームにロードするとは思いません。

その解決策は次のとおりです。

1. Load your page "http://www.rce-event.de/modules/meldung/annahme.php?oid=471&pid=1&ac=d98482bbf174f62eaaa4664c&tkey=468&portal=www.dachau.de&ortsbox=1&callpopup=1" 
2. Load the page "http://www.rce-event.de/modules/meldung/js/xmlhttp_querys.php?get_kat=1&time=1338409551228&id=1&block=kat" > which will return the "event.theme" select data/values
3. Then use the data loaded in step 2 to update the page loaded in step 1 by inserting a "select list with id and name set to <event.theme>" in the HTML element "kat_content"

次に、フォーム/ロードされた Web ページに「event.theme」という名前の新しい選択が含まれている必要があるため、次のコードでエラーが発生することはなくなります。

final HtmlSelect select = form.getSelectByName("event.theme");
final HtmlOption option = select.getOptionByText("Sport/Freizeit");
final Page newPage = select.setSelectedAttribute(option, false);
于 2012-05-30T20:36:58.940 に答える