10

javascript が HTML を更新した後にHTML のコンテンツを取得する方法がわかりません。

具体的には、 US Naval Observatory Master Clockから現在の時刻を取得しようとしています。現在の時刻を表示するの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);
    }  

したがって、問題は、更新された時刻を取得する方法がわからないことです。要素を確認すると、要素のコンテンツとして「読み込み中...」が表示されh1ます。

JavaScriptが有効になっていることを再確認しました。また、javascriptが更新を開始する時間を与えることを期待して、waitForBackgroundJavaScript関数を呼び出してみました。webclientしかし、まだ成功していません。

私の現在のコード:

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 を更新するにはどうすればよいですか?

4

2 に答える 2

1

この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秒になるようにチェックすることです。

もちろん、このエラー チェック動作を別のメソッドに抽出して、さまざまな条件でロジックを再利用できるようにすることをお勧めします。

于 2013-10-23T19:58:01.450 に答える