首页 文章

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

提问于
浏览
2

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

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

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

我有一些自动化的基于硒的测试,我正在使用Gradle(gradle测试)运行 . 它们成功运行并且在Jenkins中'm able to get this working using Xvfb plugin. JUnit post publish report/result info and Gradle'的report / test / index.html文件显示成功的测试运行 .

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

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

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

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

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

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

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

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

Why is this file getting deleted .

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

以下命令将创建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
  • 我没有运行Xvfb / Imagemagick等来获取URL的图像(例如:www.google.com),但试图获取测试运行期间测试在Xvfb内存虚拟帧缓冲区/文件后面呈现的所有屏幕截图 .

有没有其他工具(简单到可以安装而不搞乱Linux服务器)可以实现相同的功能(捕获以无头方式在Xvf / firefox / Linux服务器后面进行测试的所有页面的屏幕截图)?

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

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

任何输入都非常感谢 .

谢谢 .

2 回答

  • 2

    如果您正在运行Selenium,那么您可以使用driver.getScreenshotAs()

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

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

  • 2

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

    • 已安装imagemagick(.. k),即yum在RHEL上安装imagemagick .

    • 在目标服务器上创建了一个脚本,现在可以正常工作了 . 我所做的就是,在Jenkins工作中,当我已经启动了Xvfb实例(在Jenkins中使用Xvfb插件),然后在通过Gradle(或任何构建工具)运行Selenium GUI测试之前一秒钟,我调用以下内容脚本并传递参数(其中DISPLAY变量值可用于Jenkins作业,因为我们在其中使用Xvfb插件) . 在测试结束时,脚本自动存在(因为xwd命令不再获取任何输入以便正常退出)并最终在Jenkins上发布图像和.mp4(视频)文件(作为侧栏显示Test结果/视频)并使用"Image Galary Plugin"和.mp4文件归档工件(.png图像文件) .

    • 注意:这要求您的机器已安装: imagemagickxwdffmpeg . 如果传递给任何命令的选项不同 . 到您的操作系统机器,然后相应地调整它 . ffmpeg命令中的帧速率值可以是分数即1/5或0.5或15或任何你想要的东西(尝试一下,看看你得到了什么) .

    • 如果你想要存档大量数据,这取决于你 . 如果你有足够的空间,并且你的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=$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";
    

相关问题