Xvfb、Jenkins、Selenium 测试 - 捕获所有页面的屏幕截图

Xvfb, Jenkins, Selenium tests - Capture Screenshots of all pages

我正在尝试寻找有关以下问题的一些线索,但无法在网上找到好的帮助。

我 运行ning Xvfb(X 虚拟帧缓冲区),Linux 机器上的 firefox 处于无头模式。 Xvfb 主服务已启动并且 运行ning 和 DISPLAY 变量已设置。

/usr/bin/Xvfb :99 -ac -screen 0 1600x1200x16

我有一些基于 selenium 的自动测试,我正在 运行ning 使用 Gradle(gradle 测试)。他们 运行 成功了,在 Jenkins 中,我可以使用 Xvfb 插件让它工作。 JUnit post 发布 report/result 信息并且 Gradle 的 reports/test/index.html 文件显示测试成功 运行。

我只是 运行 Gradle 中 运行 测试的以下内容: gradle 测试 -DsomePropConfigFileForEnv=SomeSourceConfigFilewithPathvalue

我的问题:
1.如何获取这个自动化test/run正在渲染的所有页面的截图(即登录页面,登录后的应用程序主页面,用户在这里和那里点击主页面(即opening/clicking各种选项卡、链接、表格、按钮等),最后注销页面。

我可以从 Xvfb_screen<N> 文件中获取屏幕截图,该文件创建于-fbdir 文件夹(我们通过 Jenkins 作业 运行ning Xvfb 时指定的内容)但如果测试 运行s 成功,屏幕截图是黑页(这可能是由于我在下面提到的第二个项目符号)- -OR 有效的单页图片截图(如果在测试过程中遇到错误运行)。

我正在尝试获取自动 Selenium 测试正在呈现的所有页面(我作为 -D 参数传递给 Gradle 的配置文件具有 URLs/用户名/浏览器,版本等信息)。 PS:这不仅仅是为了某些 运行dom URL 我正在尝试使用 Xvfb DISPLAY 虚拟帧缓冲区获取图像屏幕截图。

  1. 在测试期间,我看到有一个有效的虚拟帧缓冲区文件,其大小有效。

例如:当 Jenkins 作业正在进行中并且 运行ning Gradle 测试任务和 Xvfb 插件启动了一个新的 xvfb 实例时,我看到:

/production/JSlaves/kobaloki2_1/xvfb-2015-02-04_01-16-37-6170319257811815857.fbdir/Xvfb_screen0

但是一旦测试完成(或我们的错误),这个文件就会从这个 xxxx.fbdir 文件夹中删除并且根本没有文件。

为什么要删除此文件

如果它会保留在那里,那么我可以使用 xwd/xwud 命令和其他工具(imagemagick convert 等命令)创建图像文件作为 POST BUILD 操作甚至在 BUILD 中"Invoke Gradle" 步骤后的部分。

以下命令将创建 firefox 屏幕截图的 .png 图像文件(只有一页屏幕截图)并假设 xvfb 在 DISPLAY=:107

上 运行ning
xwd -root -display :107 | convert xwd:- /tmp/capture2.png

和以下 xvfb 进程(仍然是 运行ning,其中包含一个有效的 Xvfb_screen**** 文件 - 它是由 Jenkins 作业创建的,其中配置了 Xvfb 插件因此,偏移基数 100 和 7 是 node/build 数字,使 :107 作为显示数字)。

u10002  30717 19950  1 01:16 ?        00:00:00 Xvfb :107 -screen 0 1024x768x8 -fbdir /production/JSlaves/kobaloki2_1/xvfb-2015-02-04_01-16-37-6170319257811815857.fbdir
  1. 我不是 运行宁 Xvfb / Imagemagick 等只是为了获取 URL(例如:www.google.com)的图像,而是试图获取所有屏幕截图真是个测试在测试 运行.
  2. 期间渲染 Xvfb 内存虚拟 framebuffer/file

是否有任何其他工具(足够简单,安装起来不会弄乱 Linux 服务器)可以实现相同的目的(捕获测试在 Xvf/firefox/Linux 后面呈现的所有页面的屏幕截图)无头方式的服务器)?

我也尝试过 Selenium Grid 服务器,但 FF 在那里运行(由于某种原因)因此我正在尝试 运行 这些测试使用 Jenkins,Gradle,Xvfb 插件Linux服务器(Headless模式)使用firefox浏览器,计划有N号。执行者 运行 多个 运行 这些测试,并最终捕获每个 运行.

的结果

我正在归档工件(如果有的话)并使用 Image Gallery 插件,但没有所有呈现页面的图像,运行 在 Selenium 后面 Xvfb/firefox。

非常感谢任何意见。

谢谢。

如果你是 运行 Selenium 那么你可以使用 driver.getScreenshotAs()

http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

在您需要屏幕截图并将其输出到光盘的步骤或方法的末尾设置此项。

好的,这就是我所做的。这种方法 doesn't 需要对项目的源代码进行任何更改。

  1. 已安装 imagemagick (..ck) 即 yum install imagemagick 在 RHEL 上。
  2. 在目标服务器上创建了一个脚本,现在可以运行了。我所做的就是,在 Jenkins 的工作中,当我已经启动 Xvfb 实例(在 Jenkins 中使用 Xvfb 插件)时,然后在 运行 之前的一秒钟,Selenium GUI 通过 Gradle(或任何构建工具),我调用以下脚本并传递参数(其中 DISPLAY 变量值可用于 Jenkins 作业,因为我们在其中使用 Xvfb 插件)。在测试结束时,脚本自动存在(因为 xwd 命令不再获得任何输入,所以它正常退出)最后我在 Jenkins 上发布图像和 .mp4(视频)文件(作为侧边栏 link 以显示测试结果/视频)并存档工件(使用 "Image Galary Plugin" 和 .mp4 文件的 .png 图像文件)。
  3. 注意:这需要您的机器安装:imagemagickxwdffmpeg .如果传递给任何命令的选项与 acc 不同。到你的 OS 机器,然后相应地调整它。 ffmpeg 命令中的帧率值可以是一个分数,即 1/5 或 0.5 或 15 或任何你想要的(试试看你得到什么)。
  4. 是否要归档这么大的数据由您决定。如果你有好的 space 并且你的 Jenkins 工作有更好的旧构建清理保留策略,你可以做到这一点。

#!bin/bash
##
## This script will capture Screenshot (every 0.1 seconds) of an automated GUI (for ex: Selenium tests) tests running behind a HEADLESS Xvfb display instance.
## Then, it'll create a mp4 format movie using the captured screenshots.
##
## Machine where you run this script, should have: Xvfb service running, a session started by Xvfb plugin via Jenkins, xwd,ffmpeg OS commands and imagemagick (utilities).
## - For ex, try this on RHEL to install imagemagick:  yum install imagemagick
##
## Variables
ws=;                                                  ## Workspace folder location
d=; d=$(echo $d | tr -d ':');                         ## Display number associated with the Xvfb instance started by Xvfb plugin from a Jenkins job
wscapdir=${ws}/capturebrowserss;                        ## Workspace capture browser's screen shot folder
if [[ -n  ]]; then wscapdir=${wscapdir}/; fi        ## If a user pass a 3rd parameter i.e. a Jenkins BUILD_NUMBER, then create a child directory with that name to archive that specific run.
i=1;
rm -fr ${wscapdir} 2>/dev/null || ( echo - Oh Oh.. Cant remove ${wscapdir} folder; echo -e "-- Still exiting gracefully! \n"; exit 0);
mkdir -p ${wscapdir}
while : ; do
 xwd -root -display :$d 2>/dev/null | convert xwd:- ${wscapdir}/capFile_${d}_dispId`printf "%08d" $i`.png 2>/dev/null;
 if [[ ${PIPESTATUS[0]} -gt 0 || ${PIPESTATUS[1]} -gt 0 ]]; then echo -e "\n-- Something bad happened during xwd or imagemagick convert command, manually check it.\n"; exit 0; fi
 ((i++)); sleep 0.1;
done
ffmpeg -r 5 -i ${wscapdir}/capFile_dispId_%08d.png ${wscapdir}/out_byRateOf5.mp4 2>/dev/null || echo -e "\n-- Some error occurred (may be too many files opened), exiting gracefully!\n";