Bash:ウェブサイトの読み込みが完了したことをどうやって確認できますか?

Bash:ウェブサイトの読み込みが完了したことをどうやって確認できますか?

質問

Firefoxブラウザを使用してタスクを自動化しようとしていますxdotool

まず、ブラウザで新しいタブを開きます。

firefox -new-tab "www.domain.tld"

その後(ページ以降www.domain.tld読み込み完了) 操作を行いたいです。

if [ <page has fully loaded> ]
then
    <commands>
fi

ページの読み込みが完了したかどうかbashでどのように検出しますか?

解決策

現在、私はsleep 5いくつかのページが非常に速くロードされ、他のページはあまりロードされないので、少し古いです(次のコマンドが呼び出されるまで5秒待ちます)。

答え1

たとえば、トラフィック監視サービスを使用できますiftop。このツールは、ホスト名(または必要に応じてIP)に基づいて接続を表示します。

 #!/bin/bash
 while ( iftop -t -s 5 2>/dev/null | grep www.domain.ltd >/dev/null ) ; do
   echo "still loading"
 done

限界:

  • 走らなければrootならない
  • 正しいホスト名解決を想定します(たとえば、YouTubeでは失敗し、さまざまなホスト名を使用しますが、YouTubeは使用しません)。
  • ホスト名の確認時にIPv6のサポートがわからない
  • トラフィックを正しく確認するのに数秒かかります。
  • 特定の要素を継続的にリロードするウェブサイトはどうですか?

あるいは、nethogsプロセスごとの分析が実行され、送信と受信の両方が表示されます。たとえば、数が2の場合、2秒を遅らせます。

 #!/bin/bash
 while ( nethogs -t -c 2 -d 2 2>/dev/null | grep firefox >/dev/null ) ; do
   echo "still loading"
 done

限界:

  • 走らなければrootならない
  • 監視プロセス:Webブラウザに継続的にデータを読み込む他のタブがある場合、Webブラウザは機能しません。 (例:ウェブサイトの音楽)
  • トラフィックを正しく確認するのに数秒かかります。

または、tcpdumpこれは着信TCPパケットに制限され、次によって決定されます。timeout

while ( timeout  3 tcpdump 'tcp' -Q in -q 2>/dev/null |
        grep www.domain.ltd >/dev/null) ; do
  echo "still loading"
done

制限事項:参照iftop


結論:すべての方法はネットワークトラフィックの監視に基づいています。つまり、トラフィックを分析するのに数秒かかり、大規模なウェブサイトの読み込みを保証するのに役立つ可能性がありますが、小規模なウェブサイトの場合、全体的なプロセス速度は向上しません。プロセスウェブサイト。

答え2

質問に記載されている問題を解決するため、@Fiximanの回答を受け入れました。しかし、私の特別なケース(MathJaxの公式がたくさんあるウェブサイトを印刷しようとしている場合)は、ページがロードされた後でも公式がレンダリングされ続けるため、彼のソリューションは機能しません。ページが読み込まれ、一部のレンダリングプロセスが完了するのを待つ必要がある同様の状況に直面した場合は、次の回避策を使用できます。正しく機能するには、ページソースにいくつかのJavaScriptを追加する必要があります。したがって、サイトがあなたのものであるか、ページをダウンロードし、ソースコードを操作し、いくつかのローカルサーバーを起動する必要があります。

汎用ソリューション

ページのロードが完了した後にbashスクリプト(javascriptを含む)を呼び出すには、次の手順を実行します。

ハイパーテキストマークアップ言語

<!DOCTYPE html>
<html>
<head>
  <title>This is the page title</title>
  <script>
      // Save the page title in a variable
      let pageTitle = document.title;
      // Set the page title to something like...
      document.title = "Page is loading..."
      // If page has finished loading
      document.addEventListener("DOMContentLoaded", function(event) {
          // Set page title to original page title
          document.title = pageTitle;
      });
  </script>
</head>
<body>
<h1>Hello world!</h1>
</body>
</html>

吹く

# Open new tab
firefox -new-tab "www.domain.tld"

# Wait 1 second
sleep 1

# Wait until page has finished loading...
  while (xdotool search --name "Page is loading... - Mozilla Firefox" > /dev/null 2>&1) ; do
    sleep 0.1
  done

# Then execute new command
# < some command >

MathJax 3ソリューション

私の場合は、ページの読み込みが終わり、MathJaxがレンダリングを終了するのを待ちたいと思います。そのため、「ページタイトルを元のページタイトルに設定」部分をMathJax設定に移動する必要がありました。

<script>
  window.MathJax = {
    // ...
    // < your configurations >
    // ...
    startup: {
      // If page has finished loading
      pageReady() {
        // If MathJax has finished typesetting
        return MathJax.startup.defaultPageReady().then(function() {
          // Set page title to original page title
          document.title = "This is the page title";
        });
      }
    }
    {{ end }}
  };
</script>

関連情報