2014-12-03 67 views
7

这是Set firefox profile with protractor主题的后续行动。使用承诺配置多个功能

按照setFirefoxProfile HOWTO,可以设置Firefox配置文件与使用firefox-profileq库随时进行编码的Firefox配置特殊"helper" js code

这为我工作,直到我试图使用多个浏览器和配置multiCapabilities

exports.config = { 
    seleniumAddress: 'http://localhost:4444/wd/hub', 

    multiCapabilities: [ 
     { 
      browserName: 'chrome', 
      specs: [ 
       'footer.disabledCookies.spec.js' 
      ], 
      chromeOptions: { 
       prefs: { 
        'profile.default_content_settings.cookies': 2 
       } 
      } 
     }, 

     ... 
     // other capabilities here 
     ... 

     helper.getFirefoxProfile()  
    }, 

    ... 
} 

在此设置下,我得到一个错误(全回溯here):

规范模式不匹配任何文件。

据我所知,这意味着使用Firefox配置文件的设置缺少specs键。换句话说,它找不到任何测试运行。我试过include specs into the capabilities dictionary inside the helper itself,但是错误依然存在。

如何修复错误,并设置火狐配置文件,如果使用multiCapabilities


作为一种变通方法,我已经创建了仅火狐单独量角器配置文件来配置(使用capabilities),并设置grunt运行两次量角器 - 一个用于这种“火狐与配置文件”配置,而另一个一个用于所有其他浏览器。

+2

我打开了一个问题https://github.com/angular/protractor/issues/1594。我认为这是你想要的。请对此问题发表评论并使用它来跟踪更新。 – hankduan 2014-12-04 19:31:42

+1

@hankduan非常感谢您对功能请求进行了详细说明。请回答(您在github问题中提供的一些技术细节),我会接受它。如果要实现该功能,我们会根据适当的说明更新答案。 – alecxe 2014-12-11 15:10:49

回答

6

现在,量角器只能接受诺言作为能力,如果我们不使用multicapabilities。原因是因为multiCapabilities在新流程中运行每个任务,所以promise(函数)无法传递(单个功能因为我们不分叉而工作)。

或者,我们可以在将解析的功能传递到新进程之前解析启动程序中的功能;然而,这将破坏建立代理的能力(https://github.com/angular/protractor/pull/1040),这依赖于在driverProvider安装之后解决能力承诺。

我想不出一个简单的方法来做到这一点(没有大的重构),但它绝对是可行的。 我为量角器创建了一个问题(https://github.com/angular/protractor/issues/1594)。如果这是你需要的,或者你有其他想法来实现它,请遵循并/或评论它。

现在,您需要使用您在原始问题中提到的解决方法。

UPDATE

https://github.com/angular/protractor/pull/1629支持这一点。从量角器1.6开始(或者如果您同步到主控),​​您可以将功能传递到config.getMultiCapabilities,如onPrepareonCleanup。此功能可以返回承诺multiCapabilties(即capabilities的数组)。

查看https://github.com/angular/protractor/blob/master/spec/getCapabilitiesConf.js为例。

+1

太棒了,试过了 - 它正在工作! (我已经用一个例子添加了一个答案,我如何使用'getMultiCapabilities()'配置量角器)要奖励你额外的奖励。再次感谢! – alecxe 2014-12-18 16:23:30

2

pull request通过@hankduan发送,这里是我以前getMultiCapabilities()不同的能力结合起来,其中一人是一个承诺(需要firefox-profile进行设置)怎么有:

"use strict"; 

var FirefoxProfile = require("firefox-profile"); 
var q = require("q"); 

exports.config = { 
    seleniumAddress: "http://127.0.0.1:4444/wd/hub", 

    getMultiCapabilities: function() { 
     var deferred = q.defer(); 

     var multiCapabilities = [ 
      { 
       browserName: "chrome", 
       specs: [ 
        "footer.disabledCookies.spec.js" 
       ], 
       chromeOptions: { 
        prefs: { 
         "profile.default_content_settings.cookies": 2 
        } 
       } 
      }, 
      { 
       browserName: "chrome", 
       specs: [ 
        "*.spec.js" 
       ], 
       exclude: [ 
        "footer.disabledCookies.spec.js", 
        "footer.disabledJavascript.spec.js", 
        "footer.disabledFlash.spec.js" 
       ] 
      }, 
      { 
       browserName: "chrome", 
       specs: [ 
        "footer.disabledFlash.spec.js" 
       ], 
       chromeOptions: { 
        args: [ 
         "--disable-internal-flash", 
         "--disable-bundled-ppapi-flash", 
         "--disable-plugins-discovery" 
        ] 
       } 
      } 
     ]; 

     // Wait for a server to be ready or get capabilities asynchronously. 
     setTimeout(function() { 
      var firefoxProfile = new FirefoxProfile(); 
      firefoxProfile.setPreference("javascript.enabled", false); 
      firefoxProfile.encoded(function (encodedProfile) { 
       var capabilities = { 
        "browserName": "firefox", 
        "firefox_profile": encodedProfile, 
        "specs": [ 
         "footer.disabledJavascript.spec.js" 
        ] 
       }; 
       multiCapabilities.push(capabilities); 
       deferred.resolve(multiCapabilities); 
      }); 
     }, 1000); 

     return deferred.promise; 
    }, 

    ... 

}; 

希望这将有助于有人在未来。

+1

感谢您的示例。 (有一件事:你不需要setTimeout) – hankduan 2014-12-20 00:41:19

+1

@hankduan好点,更新。谢谢。 – alecxe 2014-12-20 00:50:37

+0

@hankduan不知道为什么,但没有'setTimeout()'量角器正在退出,错误代码为100(尽管没有失败的测试)。这是一个[完整的追踪](https://gist.github.com/alecxe/446f15c78434665766db)。用'setTimeout()'没有错误,工作。 – alecxe 2014-12-20 23:03:51