使用promises配置多个功能

时间:2014-12-03 05:15:53

标签: javascript angularjs firefox selenium protractor

这是Set firefox profile with protractor主题的后续内容。

根据setFirefoxProfile howto,可以使用特殊"helper" js code设置firefox配置文件,该配置文件使用firefox-profileq库来创建编码的firefox配置文件苍蝇。

这对我有用,直到我尝试使用多个浏览器并配置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,如何修复错误并设置firefox配置文件?


作为一种解决方法,我创建了一个单独的量角器配置文件,仅配置了firefox(使用capabilities)并设置grunt以运行量角器两次 - 一个用于此“firefox with a配置文件“配置,另一个用于所有其他浏览器。

2 个答案:

答案 0 :(得分:6)

现在,如果我们不使用多功能,量角器只能接受promise作为功能。这是因为multiCapabilities在一个新进程中运行每个任务,因此无法传递promise(函数)(单个功能起作用,因为我们不会分叉)。

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

我无法想到一个简单的方法(没有大的重构),但它绝对可行。 我为Protractor(https://github.com/angular/protractor/issues/1594)创建了一个问题。如果这是您需要的,或者您有其他想法可以实施,请关注和/或评论。

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

更新

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 :(得分:2)

根据@hankduan发送的pull request,以下是我如何使用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;
    },

    ...

};

希望这对未来的某些人有所帮助。