2

我正在尝试通过使用 X 服务器在无头 (Xvfb) X11 中运行 Firefox 来获取 Web 缩略图。

我正在寻找一种方法来了解 Firefox 何时完成渲染,然后我可以使用图像程序来抓取窗口。

问题:我无法确定Firefox 何时完成渲染。我所知道的是,一旦完成渲染,状态栏应该有一个“完成”的输出(IE,如 GUI 中的 Firefox 所示)。

谁能知道我可以使用什么来确定 Firefox 是否完成页面渲染?

我所做的只是睡 40 秒,但这可能并不总是有效。

环境:Centos 5.7、Xvfb、Firefox 3.6.23

外壳命令:

Xvfb: 1 -screen 0 1024x768x24 &

export DISPLAY=localhost:1.0

DISPLAY=localhost:1.0 firefox http://www.example.com -width 1024 -height 768

sleep 40  **[ NEED some thing to tell me if Firefox finishes rendering ]**

DISPLAY=localhost:1.0 import -window root example.com.png

pkill firefox
4

2 回答 2

1

三种方法从我的脑海中浮出水面。

  1. 编写您自己的扩展程序来连接window.onload并触发图像采集器。
  2. window.onload编写一个能够连接并触发警报的greasemonkey 脚本。等待此类警报,然后运行您的图像采集器。
  3. 定期抓取停止按钮的图像(应该在相对于窗口的已知坐标处)并分析其颜色。如果它被禁用,则渲染完成。
于 2011-10-05T20:38:59.933 回答
0

请注意,我认为这不能FF 4.x轻易完成。这是由于这些版本的“功能”。我给你的建议是如果可以的话,使用一些不同的浏览器,比如Opera。我自己还没有测试它,但我认为它没有 FF 注意到的所有这些缺陷。见下文。

在您的情况下,以下解决方案可能是有效的:

编写一些 Greasemonkey 脚本,在屏幕某处添加一个绝对定位的矩形。

页面加载完成后,让这个矩形以 3 个周期闪烁:红色、蓝色、透明

编写一个脚本,等待至少 2 个这样的周期完成(所以它会看到红色、蓝色、某些东西、红色、蓝色),然后在透明阶段以正确的时间进行屏幕截图。

这对于 X11 和 VNC 和类似的应该是可行的。抱歉,我没有更好的解决方案,也没有可以在这里展示的代码。

就我而言,我会用EasyRFB我写的来解决类似的事情来解决它。但是,我不能向您推荐,除非您是非常绝望的天才,能够轻松阅读和理解可怕的无证代码片段;)


顺便说一句,感谢您注意到能够截取任意网页的软件包的想法,这为EasyRFB. 我自己以前从来没有想过这个。

查看 GitHub,我注意到一些基于Selenium 或 WebKit 的网络截图解决方案这些对于宣传照片当然有好处,但它们显然无法涵盖用户如何查看网页的一般用例。

也许能够从 Windows 95 IE 4、FF 1 或带有 Chimera 的 Debian Potato 等看到的任意页面自动截图会很有趣。我会看看这个;)


请注意,我在Stackoverflow上发表了另一篇文章。

有一些我称之为EasyRFBPython核心)、PHP(小型网络助手)AJAXbash(控制脚本)的东西。它已经过测试,XVnc但适用于任何VNC. 它以某种方式能够做你想做的事,但要注意,它是开发代码,没有文档,复杂且写得可怕,并且可能有问题。你可以在那里找到它:

它是为以下目的而编写的:

  • 即使在互联网连接极慢且极不可靠的情况下,也能够从移动设备控制远程 GUI
  • 完整的 UI 自动化/通过命令行替换鼠标
  • 自动化 QA 测试,基于用户看到的与浏览器或某些 Windows 间谍程序看到的对比,在输出不需要像素颜色完美的情况下

它的编写目的不是快速、高效、易于使用,也不是为了其他人(目前)。它以某种方式对我来说有效。

它能做什么:

  • 以 Web 为中心,并以某种方式为服务器提供AJAXWeb 前端。VNC
  • 保持高度压缩.jpg更新到屏幕的内容。
  • 可以无损截图
  • 能够将模板与屏幕内容进行模糊匹配
  • 模板可以用 Web 编辑edit.html- 但是这个编辑器是基本的,不是不言自明的,根本没有记录
  • 可以编写 Shell 脚本,等待这些模板匹配并发送诸如按键、鼠标移动和点击等命令到VNC
  • 有一些.sh脚本可以帮助理解这是如何完成的,但我还不能发布真正有用的东西,抱歉

没有任何记录,我无法解释如何使用它。要么你发现自己,要么你迷路了。对不起。最好不要看它,它可能会伤害你。


现在来看看 FF 在执行所有这些操作时发现的问题:

较新的 FF 版本无法正确更新屏幕。在我身边正常工作的最后一个版本是FF 3.6系列,后来有时会出现一些奇怪的行为。

例如:

  • 较新的版本现在会在更新屏幕内容之前更新状态。
  • 此外,它们对 CPU 和内存的需求如此之高,以至于完成更新屏幕的最后一步可能需要一些时间。在慢速硬件(如NSLU2,从未测试过)上,我认为在 Spinners 等已经处于“完成”状态之后甚至可能需要几分钟。

因此,即使看着微调器变成灰色,包括(!)通知“onload()”的天真的 Greasemonkey 解决方案都失败了FF 4.x,因为当您检测到它已准备好时,屏幕的某些部分可能仍未更新。

也许它只与XVnc,也许我的脚本中有一个错误触发了这一切,但FF 3.x一切都是正确的,我认为,恢复到旧版本会立即解决所有这些问题。(但我已经为所有这些麻烦准备了解决方法。但我不能发布那些脚本,抱歉。)

它变得更糟。

FF 4.x及以上显然会延迟事件处理。所以将鼠标跳出滚动条通常会使其突出显示,我认为事件不会到达滚动条。

在普通桌面上,您不会跳鼠标,但我的解决方案能够做到这一点。解决方法是生成额外的、多余的鼠标移动事件,让 FF 做正确的事情。

我还注意到,我真的不知道是因为 FF 还是 FF 中显示的网页,有时事情并没有出现在他们应该在的地方。不过,我以前从未观察过这一点FF 3.x。解决这个问题的技巧是重新加载页面。它可能与增量屏幕更新有关,但我还没有深入研究这个,因为重试(自动单击重新加载按钮)对我有用。

于 2011-10-27T20:22:07.340 回答