之前有一篇介绍了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没有正在运行程序,那么截图是全黑的
参考:
- https://wiki.archlinux.org/index.php/taking_a_screenshot
- http://www.leonardteo.com/2011/07/taking-server-side-screenshots-of-websites/
录制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)