【问题标题】:HtmlUnit need thread sleep 'before' clicking button?HtmlUnit 在单击按钮之前需要线程睡眠吗?
【发布时间】:2013-12-04 17:43:23
【问题描述】:

我正在尝试使用 HtmlUnit 从 BBC 体育网站http://www.bbc.co.uk/sport/football/live-scores 上获取分数

页面加载到英超联赛,然后有一个下拉菜单选择其他联赛,然后单击“更新”按钮更新页面(可能通过 ajax)。

此代码可以正常获取更新的分数:

    long startTime = System.currentTimeMillis();
    String titleBar = getTitleBar(page);
    HtmlOption option = ukGroupDropdown.getOptionByValue(competition);
    ukGroupDropdown.setSelectedAttribute(option, true);
    HtmlButton updateButton = (HtmlButton)page.getElementById("filter-nav-submit");
    Thread.sleep(1000);    // WHY???????
    HtmlPage newPage = updateButton.click();
    while(titleBar.equals(getTitleBar(newPage))) {
        Thread.sleep(100);
    }

    System.out.println("Took " + (System.currentTimeMillis() - startTime));
    return getMatches(newPage);

但是,如果我在单击更新按钮之前“取出 Thread.sleep”,则“newPage”永远不会更新。为什么会这样?有没有更健壮的方法(比如 titleBar 循环,它只从标题栏中获取文本,例如“巴克莱超级联赛”等)。

【问题讨论】:

    标签: java javascript ajax htmlunit


    【解决方案1】:

    也许这行:

    ukGroupDropdown.setSelectedAttribute(option, true);
    

    正在执行异步 (AJAX) 调用并且

    updateButton.click();
    

    行需要等待前者完成。

    例如,按钮可能被禁用,但在选择项目时它可能会被启用。

    【讨论】:

    • 我认为你是对的,点击一个下拉选项似乎是一个异步调用,因为如果另一个下拉列表中有一个值,那么它就会被重置。但是,肉眼不会禁用“更新”按钮,如果我在线程睡眠之前检查 updateButton.isDisabled() ,它不会被禁用。如果单击下拉菜单后页面没有可见的更改,我如何检查脚本是否已完成?
    • 好吧,我说disable 只是为了举个例子,但它可能只是一个处理onchange 事件的JS 的动作(这很可能)。解决这个问题的唯一方法是查看元素的选择在 DOM 中执行的确切更改,并尝试查询 DOM 以进行该更新。例如,可以为按钮添加一个新的 CSS 类,或者设置一个 HTML5 属性
    • 好的,我试试看——如果我在之前和之后提取 html 源代码,更改会显示在那里吗?感谢您的帮助,接受您的回答!
    • 只要你使用asXml()方法就应该。如果您使用getContentAsString(),则不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多