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运行
  • 监视进程:如果网络浏览器有其他选项卡不断加载数据,则会失败。 (例如来自网站的音乐)
  • 需要几秒钟才能正确查看流量

或者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>

相关内容