Xvfb的截图与录制

Published: 2016-09-14

Tags: Xvfb

本文总阅读量

之前有一篇介绍了Xxfb的使用方法《Firefox替换Phantomjs抓取/测试方案》,这里就不重复一遍了,主要填一下那篇文章中的坑,更正些概念,并且补充一些辅助记录Xvfb显示器内程序运行情况的方法,包括截图及录制视频

使用Xvfb虚拟显示器

之前的坑中说使用 Xvfb :1 -screen 1 1600x1200x16 & 就创建了一个虚拟显示器,但是里面没有写使用方法。

其实很简单,可能当时没有太多时间研究,只需要DISPLAY=:1 firefox http://www.qq.com 即可

但是还有一些坑,准确的说是错误,上边的指明了-screen 1 1600x1200x16屏幕1的尺寸,Xvfb的规则会自动创建一个screen 0显示器,其信息为1280x1024x8,然后如果执行刚刚用的火狐打开qq网站的操作,那么使用的显示器将会是默认的screen 0

这点很容易忽视,解决办法有两种

  • 创建虚拟显示器的时候使用Xvfb :1 -screen 0 1600x1200x16 & 覆盖默认的显示器配置
  • 执行程序的时候指定屏幕编号,DISPLAY=:1.1 firefox http://www.qq.com,1.1的意思就是使用1号服务,第一块屏幕

填坑完毕

截图Xvfb

当程序运行的时候,比如预定的selenium没有按时打日志,也没有异常推出,是不是卡到哪里了呢,手动调试的时候还是蛮有用的

服务器上需要安装ImageMagick,它带有一个import命令,需要使用

这两种写法都是可以

  • DISPLAY=:1.1 import -window root screenshot.png
  • import -window root -display :1.1 -screen screenshot.png

注意使用的服务编号及屏幕编号,使用xvfb-run也是同理,默认的servernum是99,如果selenium没有正在运行程序,那么截图是全黑的

参考:

录制Xvfb

使用ffmpeg可以对Xvfb的进行录制,如果本地调试与线上不一致,日志也看不出问题,截图也莫名其妙,最后,只能看看服务端selenium driver的操作执行情况,那么录制下来可能会有所帮助

命令很简单,需要安装ffmpeg

ffmpeg -video_size `DISPLAY=:2 xdpyinfo | grep 'dimensions:'|awk '{print $2}'` -framerate 30 -f x11grab -i :2.0 output.mpg

上边的命令需要说明的就是-i参数,它和之前介绍的服务编号及屏幕编号的写法是相同的,其实它还能偏移动,详见:Using ffmpeg with xvfb renders a cropped version of the screen 中的第一个答案

还有一个不错的包装后的工具,使用Node写的,也不错,https://github.com/lightsofapollo/x-recorder (作者),但是他好久没有更新了。导致Node.js v5.0已经不能运行了,然后一个人提交了PR,也没理人家。去使用这个更新后的吧:https://github.com/SteveNewson/x-recorder

Python判断Selenium状态

因为如果selenium没有正在运行程序,截图是全黑的,所以就可以通过代码方便判断后台程序是正在运行程序还是在等待,比如使用浏览器浏览网页的时候,如果是打开浏览器,那么左上角的位置是浏览器的标题栏目,就一定不是黑色的。如果任务运行完成,那么就是黑色的,当然,判断程序是在运行态还是等待态,程序中写代码标志位最好,这种是不修改程序的外部判断

from PIL import Image
im = Image.open("screenshot.png")
pix = im.load()
print im.size
print pix[6,6]

黑色的截图,输出的为int类型的0,打开浏览器的时候,截图此处颜色值为tulpe类型的(232, 232, 231)