2014-12-03 110 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