如何根据下拉列表中的值在量角器中创建 json 字符串

How to create a json string in protractor from values in a dropdown

假设您有一个要验证的下拉菜单。一个不错的方法(如果我错了请纠正我)是将这些值与预期值的 JSON 数组(字符串化)进行比较。

<select>
  <option value="--">Pick a State</option>
  <option value="AL">Alabama</option>
  <option value="AK">Alaska</option>
  ...
</select>

我终于弄明白了如何获取 "value" 属性和文本值,尤其是从数组中。 (对于刚开始的 javascript 家伙来说,这不是一件容易的事。)

无论如何,我已经解决了:

var actual = [];
$$('select option').each( function(el) {
  var name = '';
  var abbrev = '';

  el.getText().then(function(s) { 
    name = s; 
  }); 

  el.getAttribute('value').then(function (val) { 
    console.log("val = {"+val+"}"); 
    abbrev = val; 
  });

  console.log("abbrev = {"+abbrev+"}");  
  arr.push({ "name": name, "abbreviation": abbrev 
}); 

如你所料,结果出来了......嗯,那些非常熟悉的人。

abbrev = {}
abbrev = {}
abbrev = {}
val = {--}
val = {AL}
val = {AK}

actual 看起来像:

[ 
  { name: '', abbreviation: '' },
  { name: '', abbreviation: '' },
  { name: '', abbreviation: '' } 
]

可以看出,.then 方法发生在它的包含块完成执行之后。

我的问题是,如何修复它才能得到以下结果:

[
  { "name": "Pick your State", "abbreviation": "--" },
  { "name": "Alabama", "abbreviation": "AL" },
  { "name": "Alaska", "abbreviation": "AK" }
]

注意: 对于将来可能遇到这个问题的其他人: $$('') 是 shorthand,相当于(据我所知)element.all(by.css(''))。对于 element(by.css(''))

$('') 是 shorthand

更新:

我差不多想通了。

var actual = []; 
ddOption.each(function(el) { 
  actual.push({ 
    "name": el.getText().then(function(s) { return s; }), 
    "abbreviation": el.getAttribute('value').then(function(s) { return s; }) 
  }); 
});

所以,当我打电话时,例如 actual[2].name 我在 return 中得到 Alaska,而 actual[2].abbreviation 给我 AK。 但是,如果我尝试将其放入字符串

actual[2].abbreviation + ' = ' + actual[2].name

我以字符串形式获取 Promise 信息。当我尝试 actual[2].name.valueOf().

时相同
ManagedPromise::1372 {[[PromiseStatus]]: "fulfilled"} = ManagedPromise::1363 {[[PromiseStatus]]: "fulfilled"}

如何将承诺的 returned 值转换为字符串?

实例:

有人可以举出我正在尝试做的活生生的例子。

  1. 在 elementExplorer 中启动量角器:protractor --elementExplorer
  2. 禁用同步(我们要访问的页面在 iFrame 中包含 angular 应用程序):browser.ignoreSynchronization = true;
  3. 获取页面:browser.driver.get('http://www.w3schools.com/angular/tryit.asp?filename=try_ng_select')
  4. 切换到 iframe:browser.switchTo().frame('iframeResult')
  5. 设置 ddOption: var ddOption = $$('select option')
  6. 全部在一行中(因为 elementExplorer 不处理多行命令......至少不是以我可以告诉的方式),我们将重置 actual 然后施展魔法(单行的细分显示在上面的更新中): var actual = []; ddOption.each( function(el) { actual.push({ "name": el.getText().then(function(s) { return s; }), "abbreviation": el.getAttribute('value').then(function(s) { return s; }) }); });
    1. 键入 actual[1].name 并得到 Emil 作为输出
    2. 键入 actual[1].name + ' = ' + actual[1].abbreviation 并获得以下输出。 ManagedPromise::929 {[[PromiseStatus]]: "fulfilled"} = ManagedPromise::938 {[[PromiseStatus]]: "fulfilled"} 我希望得到 Emil = string:Emil

在推送数组之前,您需要等待您的承诺解决,在 jQuery 我使用 $.when 方法加入承诺,您应该在延迟库实现中找到等效项。使用量角器它可能看起来像这样。

protractor.promise.all([promise1,promise2]).then(function(){
  //array push logic
}

完整代码应如下所示:

var actual = [];
$$('select option').each( function(el) {
  var name = '';
  var abbrev = '';

  var promise1 = el.getText().then(function(s) { 
    name = s; 
  }); 

  var promise2 = el.getAttribute('value').then(function (val) { 
    console.log("val = {"+val+"}"); 
    abbrev = val; 
  });

  protractor.promise.all([promise1,promise2]).then(function(){
    console.log("abbrev = {"+abbrev+"}");  
    arr.push({ "name": name, "abbreviation": abbrev  });
  }
});