Htmlunit:如何在ajax dom操作后更新页面

时间:2014-12-16 10:03:37

标签: javascript htmlunit

使用HtmlUnit 2.15,我们正试图抓第三方网站。其中有一个文本框,onblur调用javascript函数,该函数在同一页面上的选择框中添加一个选项。

使用Htmlunit,我能够成功触发onb​​lur事件,但是如何处理“已更改”页面,该页面具有新添加的选项元素?

代码段:

final HtmlPage page = webClient.getPage(myUrl);

HtmlSelect selectDropDown = (HtmlSelect)page.getElementByName(selectname);
List<HtmlOption> options = clickThis.getOptions(); // returns 4 options 

HtmlTextInput myTextBox = page.getElementByName(textboxname);
myTextBox.setValueAttribute("myText");
myTextBox.fireEvent(Event.TYPE_BLUR);

//现在如何获取“更新”页面?它应该有5个选项

1 个答案:

答案 0 :(得分:0)

您需要等到javascript更改了网页。我的经验是,这可能需要一段时间。特别是如果调用服务器是其中的一部分。

到目前为止,我的尝试是轮询页面,直到某些内容发生了我预期的变化。

这是一种等待给定文本出现在页面上的方法;

   private static final int AJAX_MAX_TRIES_SECONDS = 30;
   /**
     * Waits until the given 'text' appeared or throws an
     * WaitingForAjaxTimeoutException if the 'text' does not appear before we timeout.
     * @param page
     * @param text The text which indicates that ajax has finished updating the page
     * @param waitingLogMessage Text for the log-output. Should indicate where in the code we are, and what are we waiting for
     * @throws WaitingForAjaxTimeoutException
     */
    public static void waitForAjaxCallWaitUntilTextAppears(//
            @Nonnull final HtmlPage page, //
            @Nonnull final String text,//
            @Nonnull final String waitingLogMessage) throws WaitingForAjaxTimeoutException {
        LOGGER.debug("_5fd3fc9247_ waiting for ajax call to complete ... [" + waitingLogMessage + "]");
        final StringBuilder waitingdots = new StringBuilder("   ");
        for (int i = 0; i < AJAX_MAX_TRIES_SECONDS; i++) {

            if (page.asText().contains(text)) {
                waitingdots.append(" ajax has finished ['").append(text).append("' appeared]");
                LOGGER.debug("_8cd5a34faf_ " + waitingdots);
                return;
            }
            waitingdots.append('.');
            wait(page);
        }
        LOGGER.debug("_de5091bc9e_ "
                + waitingdots.append(" ajax timeout ['").append(text).append("' appeared NOT]").toString());
        LOGGER.debug("_f1030addf1_ page source:\n" + page.asXml());
        throw new WaitingForAjaxTimeoutException();
    }

还要确保启用了javascript。 (这是默认值):

webClient.getOptions().setJavaScriptEnabled(true);