如何让我的Selenium测试套件在Xnest或Xephyr中启动Firefox实例并通过?

如何让我的Selenium测试套件在Xnest或Xephyr中启动Firefox实例并通过?,firefox,testing,selenium,x11,Firefox,Testing,Selenium,X11,我的软件已设置为运行测试套件,我执行以下操作: $ make selenium-test 通过这种方式,套件可以顺利通过。然而,让Firefox实例出现在我的桌面上会让人分心。此外,当我移动鼠标时,有时会意外地使一些测试失败。因此,我希望在Xnest或Xephyr中运行Firefox,以便它与我的其他应用程序分开。我所做的是: $ Xnest :1 & $ DISPLAY=:1 make selenium-test 当我这样做,并且我的测试套件设置为运行Chrome时,就没有任何问题

我的软件已设置为运行测试套件,我执行以下操作:

$ make selenium-test
通过这种方式,套件可以顺利通过。然而,让Firefox实例出现在我的桌面上会让人分心。此外,当我移动鼠标时,有时会意外地使一些测试失败。因此,我希望在Xnest或Xephyr中运行Firefox,以便它与我的其他应用程序分开。我所做的是:

$ Xnest :1 &
$ DISPLAY=:1 make selenium-test
当我这样做,并且我的测试套件设置为运行Chrome时,就没有任何问题了。但是,当我使用Firefox时,我遇到了以下问题:

  • 我无法单击Firefox的菜单。这是必要的,因为我有时会告诉Selenium,如果测试失败,就让浏览器保持打开状态

  • 我无法在Firefox中键入任何内容。这是必需的,因为我的一些测试涉及键入文本或选择文本

  • 一个与Chrome完美配合的Selenium测试套件在Firefox上失败了,对此没有很好的解释

  • 由于第二点,每当我尝试在Xnest或Xephyr中运行测试套件时,它都会失败

    我已经检查了可以传递给Xnest和Xephyr的选项,但没有看到任何有用的内容

    涉及的版本包括:

    • Firefox22和24
    • 硒2.35.0和2.37.2
    • Xnest和Xephyr 1.14.3
    不可点击菜单和神秘测试失败的解决方案 第一个和第三个问题可以通过在Xnest或Xephyr实例中运行windows管理器来解决。例如:

    $ DISPLAY=:1 openbox &
    
    请注意,运行窗口管理器不会解决与浏览器不兼容有关的问题。然而,我做过一些测试,如果没有窗口管理器,在Firefox上切换浏览器窗口会失败。(这些测试完全精细铬合金。)

    打字解决方案 第二个问题是由于Firefox与DBus交互。这个快速而肮脏的脚本(我们称之为
    start on display
    )说明了如何修复它:

    #!/bin/sh
    
    unset GTK_IM_MODULE
    unset QT4_IM_MODULE
    unset CLUTTER_IM_MODULE
    unset XMODIFIERS
    unset DBUS_SESSION_BUS_ADDRESS
    
    display=$1
    shift
    
    export DISPLAY=$display
    exec "$@"
    
    此脚本的使用方式如下:

    $ start-on-display :1 firefox
    
    或者使用测试套件:

    $ start-on-display :1 make selenium-test
    
    虽然
    DBUS\u SESSION\u BUS\u ADDRESS
    是在Firefox中进行输入时必须完全取消设置的唯一变量,但也建议取消设置与输入方法相关的其他环境变量。例如,它有助于铬。Chrome将毫无问题地启动和运行,但如果您需要输入,则必须在响应之前将其输入方法切换为“无”。如果您在启动Chrome之前取消设置输入法变量,那么您就不必在键入之前切换其输入法

    其他可能性 为了避免分心和与测试浏览器的意外交互,除了使用Xnest或Xephyr之外,还可以执行以下操作

    请求将浏览器映射到屏幕外 我还没有测试过,也不知道浏览器或Selenium是否会出现问题。如果要检查已在运行的实例,可以使用类似于
    wmctrl
    的方法将浏览器带回可见空间

    使用其他虚拟桌面

    (我考虑移到另一个屏幕,在不同的名称下是相同的策略。)< /P> 移动到其他虚拟桌面,在那里启动浏览器,然后返回主桌面。必须手动来回操作是一种痛苦

    或者可能有什么东西可以自动将浏览器映射到另一个桌面?您必须将为测试目的启动的浏览器实例与桌面上可能已经运行的浏览器实例区分开来。我以前使用过客户机属性,比如
    WM\u NAME
    WM\u CLASS
    。这并非不可能,但很快就会变得复杂

    附加提示
    • 如果使用aewm或fvwm等极简主义窗口管理器,Chromedriver很难确定Chrome的位置和大小。解决方案是根本不使用窗口管理器(但Firefox的菜单不起作用)或使用更强大的管理器。我在openbox方面取得了很好的成功