通过Javascript更新后获取更改后的HTML内容?(htmlunit)

我在弄清楚javascript更新后如何获取某些HTML内容时遇到了一些麻烦。


具体来说,我正在尝试从美国海军天文台总时钟获取当前时间。它有一个h1与元件ID的USNOclk,其中它显示当前时间。


首次加载页面时,此元素设置为显示“正在加载...”,然后javascript启动,并通过来将其更新为当前时间


function showTime()

    {

        document.getElementById('USNOclk').innerHTML="Loading...<br />";

        xmlHttp=GetXmlHttpObject();

        if (xmlHttp==null){

            document.getElementById('USNOclk').innerHTML="Sorry, browser incapatible. <BR />";

            return;

        } 

        refresher = 0;

        startResponse = new Date().getTime();

        var url="http://tycho.usno.navy.mil/cgi-bin/time.pl?n="+ startResponse;

        xmlHttp.onreadystatechange=stateChanged;

        xmlHttp.open("GET",url,true);

        xmlHttp.send(null);

    }  

因此,问题在于我不确定如何获取更新时间。当我检查元素时,我看到“正在加载...”作为h1元素的内容。


我仔细检查了javascript是否已启用,并尝试在waitForBackgroundJavaScript上调用该函数,webclient希望它能给javascript时间来开始更新内容。但是,到目前为止还没有成功。


我当前的代码:

import com.gargoylesoftware.htmlunit._

import com.gargoylesoftware.htmlunit.html.HtmlPage


object AtomicTime {


  def main(args: Array[String]): Unit = {

    val url = "http://tycho.usno.navy.mil/what.html"

    val client = new WebClient(BrowserVersion.CHROME)


    println(client.isJavaScriptEnabled()) // returns true

    client.waitForBackgroundJavaScript(10000)

//    client.waitForBackgroundJavaScriptStartingBefore(10000) //tried this one too without success

    var response: HtmlPage = client.getPage(url)

    println(response.asText())

  }

}

如何触发JavaScript更新HTML?


慕标5832272
浏览 910回答 2
2回答

蛊毒传说

尽管该waitForBackgroundJavaScript方法似乎是一种不错的选择,但值得一提的是它是实验性的。您可以在JavaDocs中看到以下内容:实验性API:在下一发行版中可能会更改,但可能无法完美运行!因此,我建议采用稍微更复杂的方法:int amountOfTries = 10;while (amountOfTries > 0 && CONDITION) {&nbsp; &nbsp; amountOfTries--;&nbsp; &nbsp; synchronized (page) {&nbsp; &nbsp; &nbsp; &nbsp; page.wait(1000);&nbsp; &nbsp; }}请注意,amountOfTries如果请求存在某种问题,则可以采取适当的措施。否则,您最终将使自己陷入无限循环。小心点。然后,您应该替换CONDITION为您的实际状况。在这种情况下page.getElementById("USNOclk").asText().equals("Loading...")简而言之,上面的代码所做的是检查条件,使其true每秒变为最多10几秒钟。当然,更好的方法是将这种错误检查行为提取到单独的方法中,以便您可以在不同条件下重用逻辑。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java