8

我注意到,在网格上并行运行多个 selenium firefox 测试时,焦点事件处理无法正常工作。我已经确认,当我的每个测试都单独运行并关注操作系统时,测试通过 100% 的时间。我还使用 Chrome 在网格上并行运行了测试,但没有发现问题。

我在 google groups 上发现了以下线程,这表明在单独的 xvfb 实例中启动每个浏览器可能是一个可行的解决方案。 https://groups.google.com/forum/?fromgroups#!topic/selenium-developers/1cAmsYCp2ho%5B1-25%5D

测试失败的部分是由于项目中使用的 jquery 日期选择器。日期选择器在焦点事件上启动,并且由于同时执行多个 selenium 测试,因此 webdriver 测试执行 .click() 命令,但焦点没有保持足够长的时间以显示日期选择器小部件。

.focus(function(){ $input.trigger("focus"); });

我的问题是,是否有人以前见过这个并通过一些 Firefox 配置文件设置解决了这个问题。我尝试加载以下对问题没有影响的属性。

profile.setAlwaysLoadNoFocusLib(true);

测试失败的方式与之前在远程驱动程序 Firefox 配置文件中启用并加载该属性的方式相同。

我需要一种方法来确保 100% 的时间触发焦点事件,或者解决多个 Firefox 浏览器争夺焦点的问题。考虑到 Chrome 没有显示这些问题,我想知道它是否也可能被视为 Firefox 中的错误。

谢谢!

4

3 回答 3

2

@djangofan:错了。您无法锁定焦点。在您在一个窗口中请求焦点并触发操作之前,另一个窗口请求焦点,并且您的操作(例如将键发送到输入字段)不起作用。这在我们的测试中每天都会发生几次。很难重现,因为每次测试运行都会在不同的地方失败。一种解决方案是在单独的显示中执行每个浏览器。例如,您可以使用 Xvfb:

  Xvfb ... -screen 1 1200x800x24 -screen 2 1200x800x24 ...

然后,当您启动浏览器时,为其分配一个单独的屏幕:

  browser.setEnvironmentProperty("DISPLAY", ":N.1");
  browser.setEnvironmentProperty("DISPLAY", ":N.2");
  ...
于 2015-02-15T19:42:11.600 回答
0

我在与 Jenkins 的持续集成环境中遇到了同样的问题。经过长时间的研究,我发现了Firefox中的一个旧错误,它导致了一个新的配置标志来避免这些问题。

解决方案是在测试使用的 firefox 配置文件上启用此标志。标志是focusmanager.testmode,将其设置为 true。

在此处输入图像描述

解释是只有在firefox窗口处于活动状态时才会触发焦点事件。如果您运行多个测试,则您有多个窗口,因此只有活动的一个会触发焦点事件。使用此参数,即使对于非活动窗口也会触发事件。

于 2018-02-16T13:49:59.527 回答
-1

您可以对此进行争论,并毫无问题地控制它。首先编写一个方法,通过其窗口句柄 id 来识别弹出窗口。然后,使用 JavaScriptExecutor 在 javascript 中执行“window.focus()”以强制窗口在您执行另一个操作之前聚焦。然后,如有必要,您可以通过其窗口句柄名称关闭弹出窗口。

于 2013-06-25T23:14:26.353 回答