2016-04-27 14 views
0

確認したいドロップダウンがあるとします。まともな方法(私が間違っている場合は私を修正する)は、値を期待値のJSON配列(文字列)と比較することです。ドロップダウンの値から分度器でjson文字列を作成する方法

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

「値」属性とテキスト値を、特に配列から取得する方法を最終的に考え出しました。 (。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" } 
] 

注:将来的にこの質問時に発生する可能性があり、他人のために : $$('')は速記であります(私が知る限り)element.all(by.css(''))と同等です。そして$('')element(by.css(''))

UPDATEの省略形です:私はそれがほとんど考え出し持っ

。私は呼び出しを行うときに

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ように私はお返しにAlaskaを取得し、actual[2].abbreviationは私にAKを与えます。私は、文字列

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

にそれを置くしようとした場合 はしかし、私は、文字列として有望情報を取得します。実際の[2] .name.valueOf()を試してみるときも同じです。

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

返された約束を文字列として変換するにはどうすればよいですか?

LIVE例:

一つは、私が何をしようとしているの実際の例を生成することができます。elementExplorerで

  1. スタート分度器:protractor --elementExplorer
  2. 無効同期(私たちがしようとしているページはiframe内の角度アプリを持っている):IFRAMEにbrowser.driver.get('http://www.w3schools.com/angular/tryit.asp?filename=try_ng_select')
  3. スイッチ:browser.ignoreSynchronization = true;
  4. ページを取得します。 :browser.switchTo().frame('iframeResult')
  5. ddOptionを設定します。var ddOption = $$('select option')
  6. (elementExplorerは複数行のコンマnds ...少なくとも私が知ることのできる方法ではない)、我々はactualをリセットしてから、魔法を実行します(上記の1行のブレークダウンはアップデートの上に示されています)。 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

答えて

1

を得るために期待していたところあなたはjQueryの中で、私はあなたがあなたの中に同等のものを見つける必要があり約束に参加するには$ .whenメソッドを使用し、あなたの約束は、配列をプッシュする前に解決するのを待つ必要があります遅延ライブラリの実装。分度器では、このように見えるかもしれません。提案のための

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 }); 
    } 
}); 
+0

ありがとう:

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

完全なコードは次のようになります。私は '.when'を試したときにTypeErrorを取得しました。私はおそらく間違った場所でそれを使用しました。それがそうであるように、私は本当に近いです。私の質問の更新を参照してください。 – Machtyn

+0

あなたが購読している約束の結果を得るには、すでに完了していればすぐにコールバックが呼び出されます。このシナリオでも、結果を出力する前にあなたの約束をマージする必要があります。それは型エラーを与えているとき?多分私はあなたがそれを修正するのを助けることができますか? – 42shadow42

+0

私は、質問に実際のサンプルの説明を追加しました。時間を費やしてくれてありがとう。 – Machtyn

関連する問題