量角器根据输入动态选择浏览器

时间:2018-07-17 01:13:44

标签: protractor

我是量角器的新手,我希望能够运行涂有油漆或无头的chrome浏览器。

所以我设置了类似的东西

 let chrome = {
     browserName: 'chrome',
     platform: 'MAC',
     'max-duration': '1800',

 };

let chromeHeadless = {
     browserName: 'chrome',     
    chromeOptions: {
      args: [ "--headless", "--disable-gpu", "--window-size=800,600" ]
    }
};

browserDefault = browser.params.browserToUse

exports.config = {
   params: {

    'browserToUse': "get from user'

   },
   capabilities: browserDefault,
 }

我以

的身份运行此代码
 protractor config.js --params.browserToUse='chromeHeadless' 

但这不起作用。量角器未能说明它不理解“ browser.params.browserInput”。使量角器根据输入动态选择chrome或chromeheadless的正确方法是什么

3 个答案:

答案 0 :(得分:1)

仅当代码运行到browser中时,全局变量onPrepare()才是初始化变量。您在browser函数外部使用了onPrepare(),尚未初始化browser,它是未定义的,所以遇到了错误。

您需要获取的另一点是,初始化变量browser时,打开了浏览器窗口,这意味着量角器知道启动浏览器的功能。因此,您不能使用browser.params.xxx来指定哪些功能,您需要在量角器初始化browser变量之前先告诉量角器这些功能。

let capabilitiesMap = {
    'chrome-headful' : {
        browserName: 'chrome',
        platform: 'MAC',
        'max-duration': '1800',   
    },

    'chrome-headless': {
        browserName: 'chrome',     
        chromeOptions: {
          args: [ "--headless", "--disable-gpu", "--window-size=800,600" ]
        }
    }
};

let browserToUse = 'chrome-headful'; // set default value

// extract the browserToUse value from cli
process.argv.slice(3).forEach(function(arg) {
    var name = arg.split('=')[0];
    var value = arg.split('=')[1];
    var name = name.replace('--', '');

    if (name === 'browserToUse') {
        if (Object.prototype.hasOwnProperty.call(capabilitiesMap, value) ) {
            browserToUse = value;
        }
    } 
});


let config = {

    seleniumAddress: '',
    specs: [],
    onPrepare: function() {}

};

config.capabilities = capabilitiesMap[browserToUse];

exports.config = config;

CLI示例:protractor conf.js --browserToUse=chrome-headless

答案 1 :(得分:0)

我也遇到了这个问题,并使用conf.js中的getMultiCapabilities()函数对其进行了破坏

const _ = require('lodash');    
 let capabilities = {

   chrome: {
     browserName: 'chrome',
     platform: 'MAC',
     'max-duration': '1800',

 },

chromeHeadless : {
     browserName: 'chrome',     
    chromeOptions: {
      args: [ "--headless", "--disable-gpu", "--window-size=800,600" ]
    }
}

}
getMultiCapabilities() {
    const browsers = this.params.browserToUse.split(',');//if you pass more than one browser e.g chrome,chromeHeadless
    const cap = _(capabilities).pick(browsers).values().value(); //this uses the lodash npm module
    return cap;
  },

答案 2 :(得分:0)

在仅适用于Chrome的测试环境中,我执行了以下操作。在功能方面:

chromeOptions: {
   args: []

}

 beforeLaunch: function() {
    //at this point browser is not yet defined, so process command line directly
  if (process.argv[process.argv.length-1].search('headless=true')>-1){
      config.capabilities.chromeOptions.args.push("--headless");
      config.capabilities.chromeOptions.args.push("--disable-gpu");
      config.capabilities.chromeOptions.args.push("--window-size=1600,1000");
    }  
  }

这样,在启动浏览器时,它具有正确的配置。如果我有“ headless = true”,则可能需要“ Chrome-headless”。 然后在命令行上像使用--params.headless=false一样调用它,因此我应该稍后再在浏览器启动后在脚本本身中找到它,

请注意,我只有一个命令行参数和命令行控制,因此可以认为该参数是最后一个参数就可以了。