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

Zac*_*aro 8 java scala htmlunit

javascript更新弄清楚如何获取某些HTML的内容时遇到了一些麻烦.

具体来说,我正试图从美国海军天文台主时钟获取当前时间.它有一个h1与元件IDUSNOclk,其中它显示当前时间.

首次加载页面时,此元素设置为显示"正在加载...",然后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);
    }  
Run Code Online (Sandbox Code Playgroud)

所以,问题是我不知道如何获得更新的时间.当我检查元素时,我看到"正在加载..."作为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())
  }
}
Run Code Online (Sandbox Code Playgroud)

如何触发javascript来更新HTML?

Zac*_*aro 8

我想到了!

HtmlPage对象具有executeJavaScript(String)可用于启动showTime脚本的对象.然后,一旦脚本实际启动,那就什么时候waitForBackgroundJavaScript变得相关.

我最终得到的代码:

import com.gargoylesoftware.htmlunit._
import com.gargoylesoftware.htmlunit.html.HtmlPage
import com.gargoylesoftware.htmlunit.html.DomElement

object AtomicTime {

  def main(args: Array[String]): Unit = {
    val url = "http://tycho.usno.navy.mil/what.html"
    val client = new WebClient(BrowserVersion.CHROME)

    var response: HtmlPage = client.getPage(url)
    response.executeJavaScript("showTime")

    printf("Current AtomicTime: %s", getUpdatedRespose(response, client))
  }

  def getUpdatedRespose(page: HtmlPage, client: WebClient): String = {
    while (page.getElementById("USNOclk").asText() == "Loading...") {
      client.waitForBackgroundJavaScript(200)
    }
    return page.getElementById("USNOclk").asText()
  }
}
Run Code Online (Sandbox Code Playgroud)