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

时间:2015-02-04 08:48:23

标签: selenium jenkins automated-tests capture xvfb

我试图找到以下问题的一些线索,但却无法在线找到好帮助。

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

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

我有一些自动化的基于硒的测试,我使用Gradle( gradle test )运行。他们成功运行,在Jenkins中,我能够使用Xvfb插件实现这一点。 JUnit发布报告/结果信息和Gradle的report / test / index.html文件显示成功的测试运行。

我只是运行以下命令在Gradle中运行测试: gradle test -DsomePropConfigFileForEnv = SomeSourceConfigFilewithPathvalue

我的问题:
1.如何获取此自动化测试/运行所呈现的所有页面的屏幕截图(即登录页面,登录后的应用程序主页面,用户点击主页面在那里(即打开/单击各个选项卡,链接) ,表格,按钮等),最后退出页面。

我可以从 Xvfb_screen < N >获取屏幕截图文件,它是在-fbdir文件夹下创建的(我们在通过Jenkins作业运行Xvfb时指定的)但是如果测试成功运行,屏幕截图是黑页(这可能是由于我在下面提到的第二个项目) - 或者它& #39;有效的单页图像屏幕截图(如果在测试运行期间遇到错误)。

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

  1. 在测试期间,我看到有一个有效的虚拟帧缓冲文件,其大小有效。
  2. 例如:当Jenkins作业正在进行并运行Gradle测试任务并且Xvfb插件已经启动了一个新的xvfb实例时,我看到了:

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

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

    为什么此文件被删除

    如果它仍然存在,那么我可以使用xwd / xwud命令和其他工具(imagemagick转换等命令)来创建一个图像文件作为POST BUILD动作,甚至可以在"之后的BUILD部分中创建。调用Gradle"步骤

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

    xwd -root -display :107 | convert xwd:- /tmp/capture2.png
    

    以及下面的xvfb进程(仍在运行,其中包含一个有效的Xvfb_screen ****文件 - 由Jenkins作业创建,其中Xvfb插件配置了偏移量100和7是节点/内部版本号因此,制作:107作为DISPLAY号码。

    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),但试图获取测试在Xvfb内存虚拟帧缓冲区/文件后面呈现的所有屏幕截图在试运行期间。
    2. 是否有其他工具(安装简单而不会搞乱Linux服务器)可以实现相同的目标(捕获以无头方式在Xvf / firefox / Linux服务器后面进行测试的所有页面的屏幕截图)?

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

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

      非常感谢任何投入。

      感谢。

2 个答案:

答案 0 :(得分:2)

如果您使用Selenium运行,则可以使用driver.getScreenshotAs()

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

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

答案 1 :(得分:2)

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

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

  5. #!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=$1;                                                  ## Workspace folder location
    d=$2; 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 $3 ]]; then wscapdir=${wscapdir}/$3; 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";