Bash: 웹사이트 로딩이 완료되었는지 어떻게 확인하나요?

Bash: 웹사이트 로딩이 완료되었는지 어떻게 확인하나요?

질문

Firefox 브라우저를 사용하여 작업을 자동화하려고 합니다 xdotool.

먼저 브라우저에서 새 탭을 엽니다.

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

그런 다음 (페이지 이후www.도메인.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
  • 모니터링 프로세스: 웹 브라우저에 지속적으로 데이터를 로드하는 다른 탭이 있으면 웹 브라우저가 작동하지 않습니다. (예: 웹사이트의 음악)
  • 트래픽을 제대로 확인하는 데 몇 초 정도 걸립니다.

또는 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>

관련 정보