2014-12-03 15 views
7

Đây là phần tiếp theo với chủ đề Set firefox profile with protractor.Định cấu hình nhiều khả năng với lời hứa

Theo cách setFirefoxProfile cách thực hiện, có thể đặt cấu hình firefox với "helper" js code đặc biệt sử dụng các thư viện firefox-profileq để tạo hồ sơ firefox được mã hóa khi đang di chuyển.

này làm việc cho tôi cho đến khi tôi đã cố gắng để sử dụng nhiều trình duyệt và cấu hình 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()  
    }, 

    ... 
} 

Với thiết lập này, tôi nhận được một lỗi (full traceback here):

Mẫu thông số không khớp với bất kỳ tệp nào.

Như tôi đã hiểu, điều này có nghĩa là thiết lập có cấu hình firefox bị thiếu khóa specs. Nói cách khác, nó không thể tìm thấy bất kỳ thử nghiệm nào để chạy.

Tôi đã cố gắng để include specs into the capabilities dictionary inside the helper itself, nhưng lỗi vẫn còn.

Cách khắc phục lỗi và đặt cấu hình firefox nếu sử dụng multiCapabilities?


Là một workaround, tôi đã tạo ra một tập tin cấu hình thước đo riêng biệt với chỉ firefox cấu hình (sử dụng capabilities) và thiết lập grunt để chạy thước đo hai lần - một cho này "firefox với một hồ sơ" config và khác một cho tất cả các trình duyệt khác.

+2

Tôi đã mở một vấn đề https://github.com/angular/protractor/issues/1594. Tôi nghĩ đó là những gì bạn muốn. Vui lòng nhận xét về vấn đề này và sử dụng nó để theo dõi cập nhật. – hankduan

+1

@hankduan cảm ơn bạn rất nhiều vì đã xây dựng điều này cho một yêu cầu tính năng. Vui lòng trả lời (với một số chi tiết kỹ thuật bạn đã cung cấp trong vấn đề github) và tôi sẽ chấp nhận nó. Trong trường hợp tính năng này được triển khai, chúng tôi sẽ cập nhật câu trả lời với các hướng dẫn thích hợp. – alecxe

Trả lời

6

Ngay bây giờ, thước đo góc chỉ có thể chấp nhận lời hứa là khả năng nếu chúng tôi KHÔNG sử dụng tính năng đa phương tiện. Lý do cho điều này là bởi vì multiCapabilities chạy mỗi nhiệm vụ trong một quy trình mới, do đó lời hứa (chức năng) không thể được thông qua (khả năng duy nhất làm việc bởi vì chúng tôi không forking).

Ngoài ra chúng ta có thể giải quyết khả năng trong trình chạy, trước khi đi qua các khả năng giải quyết vào quy trình mới; tuy nhiên, điều này sẽ phá vỡ khả năng thiết lập proxy (https://github.com/angular/protractor/pull/1040), dựa trên khả năng hứa hẹn sẽ được giải quyết sau khi thiết lập driverProvider.

Tôi không thể nghĩ ra một cách dễ dàng để làm điều này (không có refactoring lớn), nhưng nó chắc chắn là doable. Tôi đã tạo sự cố cho Thước đo góc (https://github.com/angular/protractor/issues/1594). Hãy làm theo và/hoặc nhận xét về nó nếu đây là thứ bạn cần hoặc bạn có ý tưởng khác để thực hiện nó.

Đối với bây giờ bạn sẽ cần phải sử dụng workaround bạn đề cập trong câu hỏi ban đầu của bạn.

CẬP NHẬT

https://github.com/angular/protractor/pull/1629 hỗ trợ này. Bắt đầu từ thước đo góc 1.6 (hoặc nếu bạn đồng bộ hóa để làm chủ), bạn có thể chuyển một hàm đến config.getMultiCapabilities như onPrepareonCleanup. Hàm này có thể trả về một lời hứa là multiCapabilties (ví dụ: mảng capabilities).

Xem https://github.com/angular/protractor/blob/master/spec/getCapabilitiesConf.js cho một ví dụ.

+1

Thật tuyệt vời, đã thử điều đó - nó đang hoạt động! (Tôi đã thêm một câu trả lời với một ví dụ về cách tôi đã cấu hình thước đo bằng cách sử dụng 'getMultiCapabilities()') Sẽ trao cho bạn một khoản tiền thưởng bổ sung. Cảm ơn một lần nữa! – alecxe

2

sau pull request gửi bởi @hankduan, đây là cách có tôi đã sử dụng getMultiCapabilities() để kết hợp khả năng khác nhau, nơi một trong số họ là một lời hứa (cần thiết cho firefox-profile được thiết lập):

"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; 
    }, 

    ... 

}; 

Hy vọng điều này sẽ giúp ai đó trong tương lai.

+1

Cảm ơn ví dụ. (Một điều: bạn không cần setTimeout) – hankduan

+1

@hankduan điểm tốt, cập nhật. Cảm ơn. – alecxe

+0

@hankduan không chắc chắn lý do tại sao, nhưng không có 'setTimeout()' thước đo là thoát với mã lỗi 100 (không có kiểm tra thất bại mặc dù). Đây là [traceback hoàn chỉnh] (https://gist.github.com/alecxe/446f15c78434665766db). Với 'setTimeout()' không có lỗi, làm việc. – alecxe

Các vấn đề liên quan