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

Lou*_*uis 2 x11 testing firefox selenium

我的软件设置为运行我做的测试套件:

$ make selenium-test
Run Code Online (Sandbox Code Playgroud)

通过这种方式,套件通过没有问题.但是,将Firefox实例显示在我的桌面上会令人分心.而且,当我移动鼠标时,我偶尔会偶然做一些测试失败.所以,我想在Xnest或Xephyr中运行Firefox,以便它与我的其他应用程序分开.我所做的是:

$ Xnest :1 &
$ DISPLAY=:1 make selenium-test
Run Code Online (Sandbox Code Playgroud)

当我这样做并且我的测试套件设置为运行Chrome时,没有任何问题.但是,当我使用Firefox时,我遇到了以下问题:

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

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

  3. 与Chrome完美配合的Selenium测试套件在Firefox中失败,并没有很好的解释.

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

我已经检查了我可以传递给Xnest和Xephyr的选项,并且没有看到任何有用的东西.

涉及的版本是:

  • Firefox 22和24.
  • 硒2.35.0和2.37.2
  • Xnest和Xephyr 1.14.3

Lou*_*uis 5

解决不可点击的菜单和神秘的测试失败

可以通过在Xnest或Xephyr实例中运行Windows管理器来解决第一个和第三个问题.例如:

$ DISPLAY=:1 openbox &
Run Code Online (Sandbox Code Playgroud)

请注意,运行窗口管理器不会解决与浏览器不兼容问题有关的问题.但是,我有测试,如果没有窗口管理器,在浏览器窗口之间切换会在Firefox上失败.(这些测试在Chrome上运行得非常.)

打字的解决方案

第二个问题是由于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 "$@"
Run Code Online (Sandbox Code Playgroud)

这个脚本可以像这样使用:

$ start-on-display :1 firefox
Run Code Online (Sandbox Code Playgroud)

或者使用测试套件:

$ start-on-display :1 make selenium-test
Run Code Online (Sandbox Code Playgroud)

虽然DBUS_SESSION_BUS_ADDRESS是唯一一个必须完全取消设置才能在Firefox中输入的变量,但建议取消设置与输入方法相关的其他环境变量.例如,它可以帮助Chrome.Chrome会毫无问题地启动和运行,但如果您需要输入它,则必须在响应之前将其输入方法切换为"无".如果在启动Chrome之前取消设置输入法变量,则在键入之前不必切换其输入法.

其他可能性

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

请求将浏览器映射到屏幕外

我没有测试它,也不知道浏览器或Selenium是否会出现问题.如果想要检查已经运行的实例,wmctrl可以使用类似的东西将浏览器带回可查看的空间.

使用其他虚拟桌面

(我考虑转移到不同的屏幕,以不同的名称使用相同的策略.)

移动到其他虚拟桌面,在那里启动浏览器,返回主桌面.必须手动来回做是一件痛苦的事.

或者也许有能够自动将浏览器映射到另一个桌面的东西?您必须将为测试目的而启动的浏览器实例与您可能已在桌面上运行的实例区分开来.我以前通过使用WM_NAME和等客户端属性完成了这个WM_CLASS.并非不可能,但这可能很快变得复杂.

其他提示

  • 如果你使用极其简约的窗口管理器,如aewm或fvwm,Chromedriver无法确定Chrome的位置和大小.解决方案是根本不使用窗口管理器(但Firefox的菜单不起作用)或使用更实质的管理器.我在openbox上取得了很大的成功.