为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕标5832272 2019-11-19 11:08:02
我在弄清楚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.HtmlPageobject 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?
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

尽管该waitForBackgroundJavaScript方法似乎是一种不错的选择,但值得一提的是它是实验性的。您可以在JavaDocs中看到以下内容:


实验性API:在下一发行版中可能会更改,但可能无法完美运行!


因此,我建议采用稍微更复杂的方法:


int amountOfTries = 10;

while (amountOfTries > 0 && CONDITION) {

    amountOfTries--;

    synchronized (page) {

        page.wait(1000);

    }

}

请注意,amountOfTries如果请求存在某种问题,则可以采取适当的措施。否则,您最终将使自己陷入无限循环。小心点。


然后,您应该替换CONDITION为您的实际状况。在这种情况下


page.getElementById("USNOclk").asText().equals("Loading...")

简而言之,上面的代码所做的是检查条件,使其true每秒变为最多10几秒钟。


当然,更好的方法是将这种错误检查行为提取到单独的方法中,以便您可以在不同条件下重用逻辑。


查看完整回答
反对 回复 2019-11-19
  • 2 回答
  • 0 关注
  • 908 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信