【问题标题】:Multiple Instances of Firefox during Selenium Webdriver Testing not handling focus correctly.Selenium Webdriver 测试期间的多个 Firefox 实例未正确处理焦点。
【发布时间】:2012-08-12 01:22:32
【问题描述】:

我注意到,在网格上并行运行多个 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 中的错误。

谢谢!

【问题讨论】:

  • 所以我发现的页面似乎缺少一些重要信息。您需要对 Linux Grid 服务器上的 firefox 安装执行一些手动操作,以解决焦点问题。我不确定为什么在未安装 Lib 时尝试使用 setAlwaysLoadNoFocusLib(true) 时没有出现异常!我目前正在查看的两个链接如下。 code.google.com/p/selenium/wiki/NativeEventsOnLinux code.google.com/p/selenium/wiki/FocusStealingOnLinux 听起来 Mac OSX 没有解决方案。
  • 可以发表您的评论作为您自己问题的答案吗?这样,问题就不会在搜索结果中显示为未回答。
  • 是的,或者只是删除您的问题,您可以在没有答案的情况下这样做。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 要在 python 中将 DISPLAY 变量设置为 Firefox 实例,只需添加:firefox.add_command_line_options('--display=:' + str(display.display))
  • 感谢 python 示例。这将如何使用 Selenium Grid 工作?在我看来,此显示设置仅在您在 xvfb 所在的同一台服务器上运行测试时才有效。如果您通过远程 selenium 网格/集线器/节点运行测试,则通过远程创建驱动程序 - 没有 FirefoxBinary 可用于设置命令行选项。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多