我在弄清楚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几秒钟。
当然,更好的方法是将这种错误检查行为提取到单独的方法中,以便您可以在不同条件下重用逻辑。
添加回答
举报
0/150
提交
取消