本主题解释如何在不打开浏览器的情况下运行 web 场景,并讨论在 Linux 上配置此模式的特殊配置步骤。
本章包含:
以无数据头模式运行
SOAtest 可以在“无数据头模式”(不显示浏览器)下运行 web 场景。
在命令行模式下(使用 soatestcli),SOAtest 默认以无头模式运行 web 场景。如果不希望从 cli 以无头模式运行,则使用带 soatestcli
的 -browserTestsVisible
命令行(如 Testing from the Command Line Interface - soatestcli中所述)。
在命令行界面使用 (soatestcli 进行测试)
为此:
- 请打开场景的配置面板。
- 在 Browser Playback Options 选项卡中,选择 Headless 选项。
通过在无数据头模式下运行测试,你可以在不需要打开和关闭浏览器窗口的情况下工作。
Linux 配置
若要在 Linux 中以无数据头模式运行 web 场景,则 SOAtest 创建其自己的隐藏 X 显示。SOAtest 使用 X 服务器 Xvfb 创建一个不需要显示硬件的虚拟 framebuffer。SOAtest 安装包括一个用于 Linux 的 Xvfb 副本(文件 Xvfb_Linux)。如果该副本存在,则将使用系统安装的 Xvfb。SOAtest搜索以下路径,顺序如下:
/usr/bin/Xvfb
/usr/X11R6/bin/Xvfb /usr/X/bin/Xvfb
/usr/openwin/bin/Xvfb
如果你的发行版不提供 Xvfb,那么 SOAtest 将使用它自己的 Xvfb 副本。这可能需要以命令行参数的形式进行一些配置。下面介绍如何配置由 SOAtest 提供的 Xvfb,以便从适当的参数开始。
如果 SOAtest 不能启动 Xvfb,那么它将在系统环境变量 $DISPLAY 指定的显示中运行浏览器。换句话说,如果你从 SOAtest GUI 启动测试,浏览器将出现在与 GUI 相同的显示中,并且 SOAtest 将从 Xvfb 输出任何启动错误消息到控制台视图。如果你正在从命令行运行测试,而没有可用的显示,那么 SOAtest 将无法启动 Firefox;因此,任何 web 场景都会失败。
让 Xvfb 独立于 SOAtest 工作
若要让 Xvfb 在从 SOAtest 调用时工作,首先让 Xvfb 独立于 SOAtest 工作。
(1)启动 Xvfb 显示 :20。
如果 :20 不可用,则使用另一个显示参数。
$ cd /path/to/soatest/plugins/com.parasoft.xtest.libs.web_[version]/root
$ ./Xvfb_Linux :20 -ac
如果得到任何错误消息,你将需要为各种与 X 相关的文件的位置指定命令行参数,这些文件的位置将取决于你的发行版。在 Fedora Core 上尝试 Xvfb_Linux 时,错误信息如下:
Couldn't open RGB_DB '/usr/X11R6/lib/X11/rgb'
error opening security policy file /usr/X11R6/lib/X11/xserver/SecurityPolicy
Could not init font path element /usr/X11R6/lib/X11/fonts/misc/, removing from list!
Could not init font path element /usr/X11R6/lib/X11/fonts/Speedo/, removing from list!
Could not init font path element /usr/X11R6/lib/X11/fonts/Type1/, removing from list!
Could not init font path element /usr/X11R6/lib/X11/fonts/CID/, removing from list!
Could not init font path element /usr/X11R6/lib/X11/fonts/75dpi/, removing from list!
Could not init font path element /usr/X11R6/lib/X11/fonts/100dpi/, removing from list!
致命服务器错误:
无法打开默认字体 'fixed'
(2)查找必要的 X 服务器文件,添加命令行参数,成功启动 Xvfb。
这就是 Fedora Core 的工作原理:
$ ./Xvfb_Linux -ac -sp /usr/lib/xserver/SecurityPolicy -fp /usr/share/X11/fonts/misc -co /usr/share/X11/rgb -screen 0 1024x768x24 :20
虚拟帧缓冲区现在正在 display :20 上运行。
(3)在创建的屏幕上运行一个简单的 X 应用程序。
$ xclock -display :20 &
通过转储 display:20 的图像并查看图像,验证时钟在 display:20 中是否可见。
$ xwd -display :20 -root | xwud
你应该查看钟。有关 xwd(1) 和 xwud(1) 的更多信息,请参阅各自的手册页。
(4)在创建的屏幕上运行 Firefox。
$ firefox --display :20
使用相同的 xwd/xwud 命令来验证 Firefox 是否在虚拟帧缓冲区中运行。
$ xwd -display :20 -root | xwud
如果你可以使用 Xvfb 创建 X 显示,但是 Firefox 无法在这个虚拟帧缓冲器上运行,那么你可能需要更新 SOAtest 外部的各种库。例如,发行版提供的过时 Cairo 库(用于 2D 图形)会在 Linux 上引起问题。如果你对 Cairo 有问题,请确保虚拟帧缓冲器使用的显示深度大于 8 位,因为这将解决一个常见问题。如果问题一直存在,则可能需要更新库本身。
让 Xvfb 与 SOAtest 一起工作
一旦确定了需要传递给 Xvfb 的参数,就可以在 SOAtest 中使用这些参数。为此,创建一个名为 Xvfb_Linux 的 shell 脚本,该脚本使用必要的参数调用 Xvfb。然后,SOAtest 将在尝试启动 Xvfb 时运行 shell 脚本。
(1)在 /path/to/soatest/plugins/com.parasoft.xtest.libs.web_[version]/root rename Xvfb_Linux to Xvfb_Linux.bin中。
$ mv Xvfb_Linux Xvfb_Linux.bin
(2)创建一个 shell 脚本 Xvfb_Linux.sh,它将使用适当的参数运行 Xvfb_Linux.bin。
这就是 Fedora Core 的工作原理:
----- #!/bin/sh # Use $@ to pass along any argument specified by SOAtest. # The $@ will include the display on which to run the server. # Currently this is always display :32. You can override this # by adding another display number as the last argument. # There can be problems with graphics libraries if you do # not set the display depth to greater than 8 using the # -screen argument. # Make sure to run Xvfb with 'exec' so that SOAtest will # kill the correct process. XVFB_DIR=`dirname $0` exec ${XVFB_DIR}/Xvfb_Linux.bin \ -ac \ -sp /usr/lib/xserver/SecurityPolicy \ -fp /usr/share/X11/fonts/misc \ -co /usr/share/X11/rgb \ -screen 0 1024x768x24 \ $@ -----
(3)创建到 Xvfb_Linux.sh 的符号链接。
$ ln -s Xvfb_Linux.sh Xvfb_Linux
当 SOAtest 运行 Xvfb_Linux 时,它将运行将适当的参数传递给 Xvfb_Linux.bin 的脚本。
或者,你可以将脚本命名为 Xvfb_Linux。但是,使用符号链接可以更容易地区分安装了什么 SOAtest 和创建了什么来运行安装的 Xvfb。
(4)以无数据头模式运行 web 场景。
当 SOAtest 运行该场景时,使用 ps(1) 检查 Xvfb_Linux.bin 是否正在运行,然后再次使用 xwd/xwud 验证 Firefox 是否正在运行。(SOAtest 将在 Firefox 完成测试运行后立即关闭它。)
$ ps -ef | grep Xvfb
$ xwd -display :32 -root | xwud
如果你将 Xvfb 配置为在不同的显示器上运行,那么在调用 xwd(1) 时使用它。