如何根据下拉列表中的值在量角器中创建 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 值转换为字符串?
实例:
有人可以举出我正在尝试做的活生生的例子。
- 在 elementExplorer 中启动量角器:
protractor --elementExplorer
- 禁用同步(我们要访问的页面在 iFrame 中包含 angular 应用程序):
browser.ignoreSynchronization = true;
- 获取页面:
browser.driver.get('http://www.w3schools.com/angular/tryit.asp?filename=try_ng_select')
- 切换到 iframe:
browser.switchTo().frame('iframeResult')
- 设置 ddOption:
var ddOption = $$('select option')
- 全部在一行中(因为 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; }) }); });
- 键入
actual[1].name
并得到 Emil
作为输出
- 键入
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 });
}
});
假设您有一个要验证的下拉菜单。一个不错的方法(如果我错了请纠正我)是将这些值与预期值的 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 值转换为字符串?
实例:
有人可以举出我正在尝试做的活生生的例子。
- 在 elementExplorer 中启动量角器:
protractor --elementExplorer
- 禁用同步(我们要访问的页面在 iFrame 中包含 angular 应用程序):
browser.ignoreSynchronization = true;
- 获取页面:
browser.driver.get('http://www.w3schools.com/angular/tryit.asp?filename=try_ng_select')
- 切换到 iframe:
browser.switchTo().frame('iframeResult')
- 设置 ddOption:
var ddOption = $$('select option')
- 全部在一行中(因为 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; }) }); });
- 键入
actual[1].name
并得到Emil
作为输出 - 键入
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 });
}
});