我尝试使用HtmlUnit填写并提交HTML表单。使用select
加载一个<body onLoad="...">
元素及其选项。
我的问题:我无法通过getSelectByName,getChildElements等检索此select
元素(抛出ElementNotFoundException),虽然我可以看到在查看<时已加载数据em> org.apache.http.wire log。
打印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)
我尝试了所有写的here,here和here(甚至更多),但都没有取得任何成功。
更新
我简化了我的代码并开始了赏金。
答案 0 :(得分: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加载的。所以我认为你的java“HtmlSelect”类不会像Javascript那样在实际用户交互中加载表单中的select“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"
然后您的表单/加载的网页应该有名为“event.theme”的新选择,因此以下代码不应再产生错误。
final HtmlSelect select = form.getSelectByName("event.theme");
final HtmlOption option = select.getOptionByText("Sport/Freizeit");
final Page newPage = select.setSelectedAttribute(option, false);