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



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

$ make selenium-test

这样,套房就可以毫无问题地通过。但是,让 Firefox 实例显示在我的桌面上会分散注意力。此外,当我移动鼠标时,我有时会不小心使某些测试失败。所以,我想在Xnest或Xephyr中运行Firefox,以便它与我的其他应用程序分开。我所做的是:

$ Xnest :1 &
$ DISPLAY=:1 make selenium-test

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

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

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

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

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

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

涉及的版本包括:

  • 火狐 22 和 24。
  • 硒 2.35.0 和 2.37.2
  • Xnest 和 Xephyr 1.14.3

无法点击的菜单和神秘的测试失败的解决方案

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

$ DISPLAY=:1 openbox &

请注意,运行窗口管理器不会解决与浏览器不兼容有关的问题。但是,如果没有窗口管理器,我已经进行了在 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 "$@"

此脚本可以像这样使用:

$ start-on-display :1 firefox

或者使用测试套件:

$ start-on-display :1 make selenium-test

尽管DBUS_SESSION_BUS_ADDRESS是唯一必须绝对取消设置才能在 Firefox 中打字的变量,但也建议取消设置与输入法关联的其他环境变量。例如,它有助于Chrome。Chrome 可以毫无问题地启动和运行,但如果您需要输入它,则必须在响应之前将其输入法切换为"无"。如果您在启动 Chrome 之前取消设置输入法变量,则无需在键入之前切换其输入法。

其他可能性

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

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

我还没有测试过它,不知道浏览器或硒是否会有问题。如果要检查已经在运行的实例,可以使用类似wmctrl之类的东西将浏览器带回可查看的空间。

使用其他虚拟桌面

(我认为移动到不同的屏幕是不同名称下的相同策略。

移动到其他虚拟桌面,在那里启动浏览器,然后返回到主桌面。必须手动来回操作是一种痛苦。

或者也许有一些东西能够自动将浏览器映射到另一个桌面?您必须区分为测试目的而启动的浏览器实例与您可能已经在桌面上运行的浏览器实例。我以前通过使用 WM_NAMEWM_CLASS 等客户端属性来执行此操作。并非不可能,但这很快就会变得复杂。

其他提示

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

最新更新