问题
我正在尝试使用 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>