【问题标题】:Protractor to dynamically choose browser based on input量角器根据输入动态选择浏览器
【发布时间】:2018-12-19 13:38:11
【问题描述】:

我是量角器的新手,我希望能够运行我的 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 的正确方法是什么

【问题讨论】:

  • browser.params.browserInput?。您能否分享控制台错误以提供更好的说明

标签: protractor


【解决方案1】:

全局变量browser 仅在代码运行到onPrepare() 时才被初始化。你在onPrepare()函数外使用了browserbrowser没有被初始化,它是未定义的,所以你遇到了错误。

另外一点你需要得到它,当变量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

【讨论】:

    【解决方案2】:

    我也遇到了这个问题,并在您的 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;
      },
    

    【讨论】:

      【解决方案3】:

      在仅使用 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 所做的那样,所以如果我想稍后在脚本本身中找到它(在浏览器启动后),它是现成的。

      请注意,我只有一个命令行参数和对命令行的控制,所以可以假设这个参数是最后一个参数。

      【讨论】:

        猜你喜欢
        • 2019-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        • 1970-01-01
        相关资源
        最近更新 更多