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

Selenium Webdriver测试期间的多个Firefox实例未正确处理焦点。,firefox,selenium,webdriver,ui-automation,selenium-webdriver,Firefox,Selenium,Webdriver,Ui Automation,Selenium Webdriver,我注意到,在网格上并行运行多个selenium firefox测试时,焦点事件处理无法正常工作。我已经确认,当我的每个测试都单独运行并且给定操作系统的焦点时,测试都会100%通过。我还使用Chrome在网格上并行运行了测试,但没有看到问题的存在 我在google groups上发现了以下线索,建议在单独的xvfb实例中启动每个浏览器可能是一个可行的解决方案。 测试失败的部分是由于项目中使用了jquery日期选择器。日期选择器在焦点事件上启动,并且由于有多个selenium测试同时执行,webd

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

我在google groups上发现了以下线索,建议在单独的xvfb实例中启动每个浏览器可能是一个可行的解决方案。

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

.focus(函数(){$input.trigger(“focus”);})

  • jQuery时间选择器插件
  • 作者:特伦特·理查森[
我的问题是,以前是否有人见过这个问题,并通过一些firefox配置文件设置解决了这个问题

profile.setAlwaysLoadNoFocusLib(true);
测试失败的方式与之前相同,该属性已启用并加载到远程驱动程序Firefox配置文件中

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


谢谢!

您可以解决这个问题,并让它在您的控制下,不会有任何问题。首先编写一个方法,通过窗口句柄id标识弹出窗口。然后,使用JavaScriptExecutor执行“window.focus()在javascript中,强制窗口在您执行另一个操作之前聚焦。然后,如果需要,您可以通过其窗口句柄名称关闭弹出窗口。

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

  Xvfb ... -screen 1 1200x800x24 -screen 2 1200x800x24 ...
然后,在启动浏览器时,为其指定一个单独的屏幕:

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

我在与Jenkins的持续集成环境中遇到了同样的问题。 经过长时间的研究,我发现了一种可以避免这些问题的方法

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


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

因此,我发现的页面似乎缺少一些重要信息。存在您需要在Linux网格服务器上对firefox安装执行一些手动操作,以解决焦点问题。我不确定为什么在尝试使用setAlwaysLoadNoFocusLib时没有出现异常(true)当库未安装时!我当前查看的两个链接如下。听起来似乎没有针对Mac OSX的解决方案。可以将您的评论作为您自己问题的答案发布吗?这样,该问题不会在搜索结果中显示为未回答。是的,或者删除您的问题,您可以在搜索时执行此操作e没有答案。要在python中将显示变量设置为Firefox实例,只需添加:
Firefox.add_命令行_选项('--DISPLAY=:'+str(DISPLAY.DISPLAY))
感谢python示例。使用Selenium网格如何工作?在我看来,只有在xvfb所在的同一台服务器上运行测试时,此显示设置才起作用。如果通过远程Selenium网格/集线器/节点运行测试,则通过远程创建驱动程序-没有FirefoxBinary用于设置逗号nd行选项。