Selenium Webdriver测试期间Firefox的多个实例无法正确处理焦点。

时间:2012-08-15 17:59:01

标签: firefox selenium webdriver ui-automation selenium-webdriver

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

我在google网上找到了以下主题,建议在单独的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中的一个错误。

谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

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

  browser.setEnvironmentProperty("DISPLAY", ":N.1");
  browser.setEnvironmentProperty("DISPLAY", ":N.2");
  ...

答案 1 :(得分:0)

我在与Jenkins的持续集成环境中遇到了同样的问题。 经过长时间的研究后,我发现old bug in firefox导致了new config flag以避免这些问题。

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

enter image description here

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

答案 2 :(得分:-1)

你可以解决这个问题并将其置于你的控制之下,没有任何问题。首先编写一个方法,通过窗口句柄id识别弹出窗口。然后,使用JavaScriptExecutor在javascript中执行“window.focus()”,以便在执行其他操作之前强制关注窗口。然后,如有必要,您可以通过窗口句柄名称关闭弹出窗口。