【问题标题】:How to make Xvfb display visible?如何使 Xvfb 显示可见?
【发布时间】:2012-08-16 12:18:35
【问题描述】:

我正在通过 Xvfb 在显示编号 :99 上运行 selenium,如下所示:

/usr/bin/Xvfb :99 -ac -screen 0 1024x768x8 & export DISPLAY=":99" && java -jar /usr/lib/selenium/selenium-server-standalone-2.24.1.jar -端口 4444

但是默认情况下不显示带有 :0 以外的数字的显示。我如何才能看到 selenium 在浏览器中实际执行的操作?

【问题讨论】:

    标签: selenium selenium-webdriver xvfb


    【解决方案1】:

    使用X11vnc

    您只需通过以下方式安装x11vnc

    sudo apt-get install x11vnc xvfb fluxbox
    

    可选择安装fluxbox以获得简单的窗口管理器。

    在 shell 中运行 x11vnc

    然后要设置对 Xvfb 的访问以进行远程控制,您可以使用 X11 over SSH 或 VNC over SSH,例如

    export DISPLAY=:1
    Xvfb $DISPLAY -screen 0 1024x768x16 &
    fluxbox &
    x11vnc -display $DISPLAY -bg -forever -nopw -quiet -listen localhost -xkb
    

    使用脚本运行x11vnc

    这是运行Xvfbx11vncfluxbox的脚本友好版本:

    export DISPLAY=${DISPLAY:-:0} # Select screen 0 by default.
    xdpyinfo
    if which x11vnc &>/dev/null; then
      ! pgrep -a x11vnc && x11vnc -bg -forever -nopw -quiet -display WAIT$DISPLAY &
    fi
    ! pgrep -a Xvfb && Xvfb $DISPLAY -screen 0 1024x768x16 &
    sleep 1
    if which fluxbox &>/dev/null; then
      ! pgrep -a fluxbox && fluxbox 2>/dev/null &
    fi
    echo "IP: $(hostname -I) ($(hostname))"
    

    注意:我在以下Docker project中使用它(检查.funcs.cmds.inc.sh)。

    使用单线运行x11vnc

    或者您可以使用以下单行:

    $ x11vnc -create -env FD_PROG=/usr/bin/fluxbox \
        -env X11VNC_FINDDISPLAY_ALWAYS_FAILS=1 \
            -env X11VNC_CREATE_GEOM=${1:-1024x768x16} \
            -gone 'killall Xvfb' \
            -bg -nopw
    

    • -create 让它启动 Xvfb
    • X11VNC_FINDDISPLAY_ALWAYS_FAILS=1 使其进入已创建的 Xvfb 会话(显示 :1 而不是 :0 这将是普通桌面)
    • FD_PROG=/usr/bin/fluxbox 让它启动 Fluxbox(Ubuntu 的那个,应该有背景 Ubuntu 徽标)
    • X11VNC_CREATE_GEOM=${1:-1024x768x16} 将屏幕设置为 16 位颜色 1024x768
    • -gone 在退出时清理,否则 Xvfb 会被抛在后面(杀死 xvfb 也会杀死 fluxbox

    连接到 VNC

    如果你的 Xvfb 只在 localhost 上监听,你可以设置到 localhost 的隧道,这样 vncviewer 就可以连接到 localhost 来远程控制服务器。例如

    ssh -N -T -L 5900:localhost:5900 user@remotehost &
    vncviewer -encodings 'copyrect tight zrle hextile' localhost:5900
    

    或者用密码监听所有地址,使用:

    x11vnc -display :0.0 -usepw
    

    要设置密码,请运行:x11vnc -storepasswd

    请参阅:Remote control over SSH 在 Xvfb 维基百科页面


    也检查一下:

    【讨论】:

    • 这应该是首选答案,因为它很全面。涵盖本地、通过隧道和远程连接到帧缓冲区的所有方面。谢谢@kenorb
    【解决方案2】:

    您可以通过在 Xvfb 显示器上运行 VNC 服务器来获得实时视图,如下所示:

    x11vnc -display :99 -localhost &
    vncviewer :0
    

    【讨论】:

    • 如果我在 Jenkins 节点上运行 Selenium + x11vnc,我是否可以远程查看正在发生的事情?我会在本地运行 vncviewer 并将其指向 Jenkins 节点吗?
    • @MikeR 原则上是的,但是 -localhost 参数意味着 x11vnc 只能从 localhost 访问,因此您可能需要与 x11vnc 不同的参数,并且可能需要一个开放的防火墙端口。或者,您可以为 VNC 的端口设置代理,例如 ssh 隧道。
    • @seanf 我看到黑屏而不是浏览器。你能看看这个问题吗? stackoverflow.com/questions/63935935/…
    【解决方案3】:

    它是虚拟的。来自手册页Xvfb(1)

    Xvfb 是一个 X 服务器,可以在没有显示硬件和物理输入设备的机器上运行。它使用虚拟内存模拟哑帧缓冲区。

    也在手册页中:

    Xvfb -pixdepths 3 27 -fbdir /var/tmp 服务器将作为服务器号 0 侦听连接,将具有默认屏幕配置(一个屏幕,1280x1024x8),还将支持像素图深度 3 和 27,并将使用 /var/tmp 中用于帧缓冲区的内存映射文件。

    xwud -in /var/tmp/Xvfb_screen0 显示上例启动的服务器的屏幕 0。

    【讨论】:

    • xwud 就像一个虚拟屏幕截图工具,对吧?
    • xwud 是 undumper,xwd(X Window 转储)是适用于任何 X 屏幕/显示的通用屏幕截图实用程序。 Xvfb 的特别之处在于它的内容已经是xwd 转储文件(如果你这么说,就是通过-fbdir)。
    【解决方案4】:

    一个简单的解决方案也是不断地对程序进行截图,如下所示:

    while /bin/true; do
        DISPLAY=:99 import -window root ~/Pictures/xvfb_screenshot.png
        sleep 0.1
    done &
    PID=$!
    feh --reload 0.1 ~/Pictures/xvfb_screenshot.png 2>/dev/null
    kill $PID
    

    注意:需要安装imagemagickfeh

    【讨论】:

      猜你喜欢
      • 2011-01-09
      • 2011-09-15
      • 2016-10-12
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 2012-06-17
      • 2015-02-19
      • 1970-01-01
      相关资源
      最近更新 更多