【问题标题】:HtmlAnchor click() function in Htmlunit is not workingHtmlunit 中的 HtmlAnchor click() 函数不起作用
【发布时间】:2012-08-26 10:07:22
【问题描述】:

我正在尝试使用 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 平台上单击此永久链接?

【问题讨论】:

  • 你能发布更多细节吗?当您 click() javascript 链接时,您怎么知道它不起作用?您希望页面上有什么变化?
  • 点击后我希望页面发生变化。一些新的链接和图片应该出现在页面中。情况是前后页面完全一致。
  • 硒是什么意思?这个? docs.seleniumhq.org/docs/…
  • @user3434609 是的。我在 2 年前改用 Selenium,从那以后几乎没有任何问题。

标签: java javascript htmlunit


【解决方案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
        });
    });

【讨论】:

    【解决方案2】:

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

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

    webClient.setAjaxController(new NicelyResynchronizingAjaxController());
    

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

    【讨论】:

    • 我尝试了所有这些方法。似乎没有任何效果。我尽可能地遵循运行时代码。似乎在 ScriptRuntime 类中,第 3183 行:result = f.doTopCall(callable, cx, scope, thisObj, args);执行最初失败,因为“结果”返回未定义。我不明白为什么......
    • 对于任何访问此问题的人,我最终解决了我的问题。解决方案是切换到 Selenium,单击上述链接没有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2017-09-09
    • 2015-02-18
    • 2019-03-31
    • 2022-01-07
    • 2021-08-07
    相关资源
    最近更新 更多