java - 使用 Ajax 的 HtmlUnit 表单刷新不起作用

标签 java ajax htmlunit

我尝试使用 HtmlUnit 填写并提交 HTML 表单。一select元素及其选项使用 <body onLoad="..."> 加载.

我的问题:我无法检索此 select元素通过 getSelectByName、getChildElements 等(抛出 ElementNotFoundException),尽管我在查看 org.apache.http.wire 日志时可以看到数据已加载。

打印时 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 (甚至更多),但没有任何成功。

更新:

我简化了我的代码并开始了赏金。

最佳答案

您的问题是,只有在名为“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在实际用户交互中那样加载表单中的选择“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);

关于java - 使用 Ajax 的 HtmlUnit 表单刷新不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10692483/

相关文章:

javascript - 使用AJAX/PHP检查文件上传是否成功

java - 如何在 Java 中使用 HtmlUnit?

java - 如何在 HtmlUnit (java) 中禁用或指定重试次数?

java - JAVA中的Yang解析

java - 使用ajax请求发布大型JSON对象

java - Mongodb聚合框架对海量数据进行排序

javascript - "respond_with_navigational"是如何工作的?

javascript - 如何使用 HTMLUnit 编写事件处理程序并检测某些 JavaScript 调用?

java - 实现抽象类 Java 的接口(interface)

java - 处理 try...finally block 中获取资源的代码重复