【问题标题】:execute onclick with HtmlUnit and get result使用 HtmlUnit 执行 onclick 并获得结果
【发布时间】:2013-12-20 12:02:47
【问题描述】:

我想使用 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);

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

【问题讨论】:

    标签: java javascript onclick htmlunit


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      试一试,可能会奏效。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多