2

我正在尝试使用 HtmlUnit 自动浏览网站。我需要在此过程中按一些按钮。首先,我用这个 xml 构建一个按钮的 HtmlAnchor 对象:

<a href="dog.php">
  <img src="http://images.hand.co.uk/Pic/site_images/hand/Myper/MyOrder/images/DogRed.gif" width="75" height="31" border="0" alt="1 adds"/>
</a>

当我使用 click() 方法单击它时效果很好。然后我被移动到另一个页面,其中有我需要单击以显示所需内容的链接。点击后我没有移动到另一个页面,它只是一个 Java 脚本函数触发。

这是第二个链接的锚点:

<a style="color: black; font-weight: bold;" href="javascript:show_me('DogDetails.php?DogID=2445485', 2445485, 800);">
  details
</a>

对于这两个元素,我使用 HtmlAnchor 对象及其 click() 方法。但是该方法对第二个元素根本没有任何作用。

我也尝试过使用内置在 HtmlUnit 中的 JavaScript 引擎,但没有成功。如何单击与 HtmlUnit 平台的持久链接?

4

2 回答 2

4

最可能的问题是 HtmlUnit 没有等待 JavaScript 完成运行。HtmlUnit FAQ 建议 3 个解决方法:http: //htmlunit.sourceforge.net/faq.html#AJAXDoesNotWork

其中,最巧妙的解决方案是让您WebClient等待 AJAX 请求完成:

webClient.setAjaxController(new NicelyResynchronizingAjaxController());

我发现有些网站在后台线程上运行 AJAX 是一个聪明的技巧——这意味着NicelyResynchronizingAjaxController它不会等待它完成,因为它只监视主 UI 线程。这里有一个很好的答案,它解释了如何等待所有线程而不仅仅是主线程。

于 2012-09-07T14:05:13.300 回答
1

我有一个类似的问题,尝试了几种方法来等待 javascript 在后台运行,但没有成功。

我有半点心思切换到 Selenium,但在 WebClient 上禁用 CSS 后它“自行解决了”:

WebClient.getOptions().setCssEnabled(false);

每当我们重新启用 CSS 时,.click() 就会停止工作。

我的锚是:

<div class="my-anchor's-parent-class"/>
  <a href="javascript:void(0) class="text" id="buttonSearch" style="display: block;">Search</a>
</div>

它有一些 JQuery 将 .click() 处理程序附加到它,它根据我的锚的父级的“类”属性采取行动:

    $('.my-anchor's-parent-class').each(function () {
        $(this).children('a').click(function () {
          // if parent has another given class appended, call .myFunction(this)
          // else, call other function
        });
    });
于 2017-04-11T12:59:50.860 回答