2016-11-15 10 views
1

私はprotractor.promise.all()を使用できることがわかります。 protractor.promise.when()はありますか?そして、それについてもっと知り、それを使う方法はどこで知ることができますか?protractor.promise.when()メソッドはありますか?

私の問題は、すべてのgetText()の約束事を解決し、失敗したものを特定し、失敗したものに対しては空白を提供する必要があることです。例えば

function getValues() { 
    let pFirstName = $('#firstname').getText(); 
    let pLastName = $('#lastname').getText(); 
    let pSSN = $('#ssn').getText(); 
    return protractor.promise.when([pFirstName, pLastName, pSSN]) 
     .then(function(values) { 
      return { 
       "first": values[0], 
       "last": values[1], 
       "ssn": values[2] // This value may or may not be on the DOM, how do I check it and provide an alternate value? 
      }; 
     }); 
} 

UPDATE:私は私の研究を続けていたよう
、私はこれはwebdriverを問題の詳細です参照してください。そして、おそらく私はブルーバードを引く必要があります。よく分かりません。

以下の質問に答えるには、「どのようなものが失敗するのはどういう意味ですか? $('#ssn') ElementFinderが実際に#ssnと一致する要素を見つけられないとします。 getText()メソッドは約束を拒否し、見つからない要素のエラーを返します。そして、そう、私は次の2つの状況になります。

<span id="firstname">Joe</span> 
<span id="lastname">Smith</span> 
<span id="ssn">123-45-6789</span> 

getValues().then(res => console.log(res)); 

は、ユーザーがSSNを見ることが想定されていない次のような状況では、{"first": "Joe","last":"Smith","ssn":"123-45-6789"}

を返し、角度doesnのでしょう「tが偶数番目の要素を作成し、我々は持っていることがあります。

<span id="firstname">Joe</span> 
<span id="lastname">Smith</span> 

私はリターンがなければならないことを期待する
getValues().then(res => console.log()); 

:より良い答えは一緒に来ない限り{"first":"Joe","last":"Smith"}または{"first":"Joe","last":"Smith","ssn":""}

+0

「どのものが失敗する」とはどういう意味ですか? –

答えて

1

ここでもう一つのアイデアです - 1よりジェネリック - すべての関連spanの要素を取得し、入力されたIDを持つオブジェクトを返すためにreduce()を使用し、テキスト:

var inputs = $$("span[id]"); // TODO: make the locator more specific 
var values = inputs.reduce(function (obj, input) { 
    return input.getAttribute("id").then(function (fieldName) { 
     return input.getText().then(function (fieldValue) { 
      obj[fieldName] = fieldValue; 
     }); 
    }); 
}, {}); 

また、存在しないフィールドのデフォルト値を持つように{}{"firstname": "", "lastname": "", "ssn": ""}、たとえば、に変更することができます。

+0

私はこのアプローチが好きです。私は、私がテストしているアプリケーションの結果に、IDが希望のプロパティ名とどのように揃っているかを確認する必要があります。この解決策には、何が存在するかだけが含まれます。一方、上記の私のソリューションは、存在しないプロパティに空白の値を与えます。 – Machtyn

+1

@Machtynありがとう、デフォルト値まで - それに近づくための1つの方法で更新されました。または、 'values'を後処理して、欠落しているフィールドを埋めることができます。 – alecxe

1

、私はこれが(ただのgetText()の呼び出しで拒否をキャッチ)の答えかもしれないと思います。私はJSFiddleに似た何かをするとき

function getValues() { 
let pFirstName = $('#firstname').getText().catch(() => ""); 
let pLastName = $('#lastname').getText().catch(() => ""); 
let pSSN = $('#ssn').getText().catch(() => ""); 

return protractor.promise.when([pFirstName, pLastName, pSSN]) 
    .then(function(values) { 
     return { 
      "first": values[0], 
      "last": values[1], 
      "ssn": values[2] 
     }; 
    }); 
} 

は、少なくとも、それが動作します:

function iffy(rVal, cond) { 
 
    return new Promise(function(resolve, reject) { 
 
     if (cond) { 
 
      resolve(rVal); 
 
     } else { 
 
    \t  reject(new Error("This is in error")); 
 
     } 
 
    }); 
 
} 
 

 
let pTruthy = iffy("true", true) 
 
    .catch(() => "Caught the error"); 
 
let pFalsy = iffy("false", false) 
 
    .catch(() => "Caught the error"); 
 

 
Promise.all([pTruthy, pFalsy]) 
 
    .then(values => console.log(values)) 
 
    .catch(err => console.log(err)); 
 

 
iffy("false", false) 
 
    .then(val => console.log(val)) 
 
    .catch(err => console.log(err.toString()));

0

ない非常に一般的なアプローチが、SSNフィールドが明示的に存在している場合は、確認することができます。これらの線に沿って何か:

function getValues() { 
    let pFirstName = $('#firstname').getText(); 
    let pLastName = $('#lastname').getText(); 
    let isSSNPresent = $('#ssn').isPresent(); 
    return protractor.promise.all([pFirstName, pLastName, isSSNPresent]).then(function(values) { 
     let result = { 
      "first": values[0], 
      "last": values[1] 
     }; 

     if (values[2]) { 
      $('#ssn').getText().then(function (ssn) { 
       result.ssn = ssn 
      }); 
     } 
     return result; 
    }); 
} 

(テストしていません)

+0

これは、if文内のgetText()を解決する前に結果を返すように見えるという問題です。それは本当ですか、私は流れを誤解していますか? – Machtyn

+0

@Machtynそれも私が恐れているものです。私はそれをテストします。ありがとう、良い点! – alecxe

+0

@Machtynはちょうどローカルにチェックし、それは私のために働く!内部の 'getText()'呼び出しで設定された追加フィールドも同様に設定されています。それはあなたのために働くのですか? – alecxe

関連する問題