我的软件设置为运行我做的测试套件:
$ 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 的选项,但没有发现任何有用的信息。
涉及的版本有:
- Firefox 22 和 24。
- Selenium 2.35.0 和 2.37.2
- Xnest 和 Xephyr 1.14.3
最佳答案
菜单无法点击和莫名测试失败的解决方法
第一个和第三个问题可以通过在 Xnest 或 Xephyr 实例中运行窗口管理器来解决。例如:
$ DISPLAY=:1 openbox &
请注意,运行窗口管理器不会解决与浏览器不兼容有关的问题。但是,如果没有窗口管理器,我已经进行了在浏览器窗口之间切换失败的测试。 (这些测试在 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 之外,还可以执行以下操作。
请求将浏览器映射到屏幕外
我没有测试过,不知道浏览器或者Selenium是否会有这个问题。如果想要检查已经在运行的实例,可以使用 wmctrl
之类的东西将浏览器带回可见空间。
使用另一个虚拟桌面
(我认为移动到不同的屏幕是不同名称下的相同策略。)
移动到另一个虚拟桌面,在那里启动浏览器,然后返回主桌面。必须手动来回操作很痛苦。
或者也许有一些能够自动将浏览器映射到另一个桌面的东西?您必须将出于测试目的而启动的浏览器实例与您可能已经在桌面上运行的浏览器实例区分开来。我之前通过使用 WM_NAME
和 WM_CLASS
等客户端属性来完成此操作。并非不可能,但这很快就会变得复杂。
其他提示
- 如果您使用 aewm 或 fvwm 等极其简约的窗口管理器,Chromedriver 将无法确定 Chrome 的位置和大小。解决方案是根本不使用窗口管理器(但 Firefox 的菜单将不起作用)或使用更强大的管理器。我在 openbox 上取得了很好的成功。
关于firefox - 如何让我的 Selenium 测试套件在 Xnest 或 Xephyr 中启动其 Firefox 实例并通过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19879554/