【问题标题】:Is it possible to read the values of multiCapabilities on beforeEach?是否可以在 beforeEach 上读取 multiCapabilities 的值?
【发布时间】:2015-12-08 23:17:32
【问题描述】:

我正在尝试启动多个与multiCapabilities 端口值相对应的代理。例如,如果_conf.js 文件有两个multiCapabilities 集,则应该使用不同的端口值启动两个代理。

_conf.js中,我设置了以下信息:

exports.config = {
...
multiCapabilities: [
{ 'browserName': 'chrome',
'proxy': { 'httpProxy': 'localhost:8889' },
'count': '1' },
{ 'browserName': 'firefox',
'proxy': { 'httpProxy': 'localhost:9001' },
'count': '1' },

期望:两个实例,一个浏览器为 chrome 的实例有一个端口为 8889 的代理。另一个使用 Firefox 作为其浏览器和一个端口为9001 的代理。

为此,我尝试在 spec.js 文件中的 beforeEach 函数中使用 browser.getProcessedConfig().then(。但是,在启动代理之前我无法获取值。

_spec.js 文件中,我试图在以这种方式启动代理之前读取httpProxy 值。

var Proxy = require('browsermob-proxy').Proxy;

describe('stress testing-' + dateone.curdate2Sec, function() {
var curport = 0;
beforeEach(function (done) {
// READ HTTPPROXY TO PASS AS A PORT NUMBER FOR PROXY
browser.getProcessedConfig().then(function(config) { 
curport = config.capabilities.proxy.httpProxy.split(':')[1];
});

/*  Proxy Part */       
var proxy = new Proxy();
return Q.ninvoke(proxy, 'start', curport) 
    .then(
        function (data) {
            console.log('data', data);
            console.log('arguments', arguments);
            browser.params.proxy = proxy;
            browser.params.proxyData = data;
            return data;
        }, 
        function () {
            console.log('start failed');
        })
    .then(
        function() {
            browser.params.proxy.startHAR(browser.params.proxyData.port, 'test', done);
        }
    );
});

量角器实例首先运行return Q.ninvoke(proxy, 'start', curport),然后解析getProcessedConfig,这发生在启动代理之后。

我尝试将/* Proxy Part */ 插入browser.getProcessedConfig().then(...),但还是不行。

有什么方法可以让我立即在beforeEach 上读取multiCapabilities 的具体值,而不是等待by .then()

这是主要的reference I used

【问题讨论】:

  • 我认为你需要结合promise,你可以通过调用getProcessedConfig()获得它,并且只有当它解决时——创建一个代理。之后 - 从 beforeEach 返回一个结果承诺,因此 Protractor 将等待所有操作序列。
  • @NathanielFord 感谢您的帮助,Nathaniel Ford!
  • @MichaelRadionov 感谢您的建议,Michael Radionov!

标签: protractor


【解决方案1】:

我认为你已经接近了,你可以将 curport 从 Promise 传递给带有 .then() 的代理函数,以创建具有正确端口号的代理。如果您发现脚本的其余部分没有等待创建代理,您可以在 controlFlow 的上下文中执行它,例如:

beforeEach(function() {
    browser.getProcessedConfig().then(function(config) {
        return config.capabilities.proxy.httpProxy.split(':')[1];
    }).then(function(curport) {
        browser.controlFlow().execute(function() {
            /*  Proxy Part */
            Q.ninvoke(proxy, 'start', curport)
            ... 
            ...
        });
    });
});

【讨论】:

  • 感谢 martin770 的回答!现在运行良好。我错过的是第二个 .then() 中的 browser.controlFlow().execute()!!
  • 是的...我们发现在使用量角器进行异步调用时,您确实必须了解执行顺序的控制流。大多数量角器函数(单击、getText 等)已经知道将自己插入到 controlFlow 中,这使得它们一个接一个地同步活动。当您定义一个异步调用或承诺时,javascript 将尝试立即异步执行它。但是如果你用 controlFlow 包装它,你可以推迟该命令的执行,直到正确的时刻,并确保它在移动到下一步之前完成。
  • 是的,这是最复杂的部分,因为这是第一次使用异步语言。谢谢!
猜你喜欢
  • 2021-07-07
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2013-06-24
  • 1970-01-01
  • 2011-05-04
相关资源
最近更新 更多