使用HtmlUnit执行onclick并获取结果

时间:2013-12-18 16:12:53

标签: java javascript onclick htmlunit

我想使用java和HtmlUnit在下面显示的html代码上运行onclick javascript函数,并获取脚本生成的信息。

<td width="13"><a class="img_attachfile16" alt="show files" title="show files" rel="Hide files" href="#" onclick="return (DocumentFiles.ShowHideFiles(12, 345234, 0, this))"></a></td>

ShowHideFiles的功能是,当您点击链接时,它会显示可以下载的文件名(在表格单元格中)及其网址。我想用java和HtmlUnit获取这些信息,但我无法让它工作。这就是我尝试过的:

webClient = new WebClient(BrowserVersion.FIREFOX_17);
HtmlPage page = webClient.getPage(url);
List tables = page3.getByXPath("//table");
//Get the right table
HtmlTable table = (HtmlTable) tables.get(11);
List<HtmlTableCell> cells = tableRow.getCells();
//Get the right cell and its childelement(where the onclick function is).
HtmlElement element = cells.get(10).getFirstElementChild();

String clickAttr = element.getOnClickAttribute();
ScriptResult scriptResult = page.executeJavaScript(clickAttr);

//Get new page
HtmlPage page2 = (HtmlPage) scriptResult.getNewPage();
System.out.println(page2.asXml());

我得到的新页面与之前相同,这意味着我没有看到我想要的额外信息。 我也试过像这样从HtmlElement执行点击:

//Same as before but now make HtmlAnchor object from right cell
HtmlAnchor anchor = (HtmlAnchor) cells.get(10).getFirstElementChild();
page2 = (HtmlPage) anchor.click();
System.out.println(page2.asXml());

与之前的尝试一样,我得到的新页面与之前相同,没有额外的信息。

我真的很感激如何解决这个问题的建议。

祝你好运 /托马斯


我添加了这一行:

webClient.setAjaxController(new NicelyResynchronizingAjaxController());
//This one after getNewPage()
webClient.waitForBackgroundJavaScript(1000);

现在新检索的页面也没有变化。 我如何获得错误日志?我没有任何例外。 我还能做什么?

2 个答案:

答案 0 :(得分:1)

我将不得不假设您正在使用该代码执行AJAX请求。如果是这种情况,则很可能问题是您没有等待页面更新。

这个问题最有可能会有所帮助:

Get the changed HTML content after it's updated by Javascript? (htmlunit)

还要确保您在日志中没有收到任何错误。

答案 1 :(得分:0)

尝试此操作后,它可能会有效。

List<HtmlAnchor> anchors = new ArrayList<HtmlAnchor>();
            anchors = homePage.getAnchors();
            HtmlPage tempPage = null;
            for (int i = 0; i < anchors.size(); i++) {
                tempPage = anchors.get(i).click();
                String secondLink = homePage.getUrl().toString();
                System.out.println(secondLink);
                client.waitForBackgroundJavaScript(10000);
                client.waitForBackgroundJavaScriptStartingBefore(10000);
            }