2016-11-17 4 views
-2

ユーザーがどんなサイトにもログインしているかどうかを調べるためのコードを少し書いた。私はコードの実行順序を理解していませんが、それを修正する方法はわかりません。どんな洞察も大変ありがとうございます。約束とセレクタが私を倒した

コード:

var login_promises = []; 
    var logout_promises = []; 
    var toggle_login_promises = []; 
    var toggle_logout_promises = []; var loginStringsExist, logoutStringsExist; 
    var string_tally = {loginStrings: 0, logoutStrings: 0, toggle_in: 0, toggle_out: 0} 
    var promises = {loginStrings: [], logoutStrings: [], toggle_in: [], toggle_out: []}; 
    var loginStrings = [ "login", 
         "Login", 
         "LOGIN", 
         "Log in", 
         "Log In", 
         "LOG IN", 
         "log in", 
         "signin", 
         "Signin", 
         "SIGNIN", 
         "sign in", 
         "Sign in", 
         "Sign In", 
         "SIGN IN", 
         "log on", 
         "Log on", 
         "Log On", 
         "LOG ON", 
         "logon", 
         "Logon", 
         "LOGON", 
         "logon id", 
         "Logon id", 
         "Logon Id", 
         "LOGON ID" 
         ]; 
    var logoutStrings = [ "sign out", 
         "Sign out", 
         "Sign Out", 
         "SIGN OUT", 
         "signout", 
         "Signout", 
         "SIGNOUT", 
         "log out", 
         "Log out", 
         "Log Out", 
         "LOG OUT", 
         "logout", 
         "Logout", 
         "LOGOUT" 
         ]; 
    var toggleInOutStrings = [ "signin/out", 
           "signin/out", 
           "sign in/out", 
           "Sign in/out", 
           "Sign in/Out", 
           "Sign In/Out", 
           "SIGN IN/OUT", 
           "sign in/out", 
           "Sign in/out", 
           "Sign in/Out", 
           "Sign In/Out", 
           "SIGN IN/OUT", 
           "login/out", 
           "login/out", 
           "log in/out", 
           "Log in/out", 
           "Log in/Out", 
           "Log In/Out", 
           "LOG IN/OUT", 
           "log in/out", 
           "Log in/out", 
           "Log in/Out", 
           "Log In/Out", 
           "LOG IN/OUT", 
          ]; 
    function login_check() { 
    } 


    var getStringExistsCount = function(string, type){ 
    return new Promise(
     function(reject, resolve){ 
     element(by.linkText(string)).isPresent() 
     .then(function(el){ 
      console.log("ELEMENTS FOUND: " + el) 
      if(el){ 
      string_tally[type] ++; 
      }else{ 
      console.log(string + " NOT FOUND"); 
      } 
      resolve(el); 
     }); 
     } 
    ) 
    } 

    var load_promises = function(arr, type){ 
    return new Promise(function(resolve, reject){ 
     for (var i = 0; i < arr.length; i++) { 
     console.log(i + ") ")// + type + " " + string + "\n" + arr.length) 
     promises[type].push(getStringExistsCount(arr[i], type)); 
     if(i === arr.length - 1){ 
      console.log(promises[type]); 
      resolve(); 
     } 
     } 
    }); 
    } 

    login_check.prototype.is_account_logged_in = function(pw) { 
    return new Promise(
     function(resolve, reject){ 
     if(pw){ 
      resolve(false) 
     }else{ 
      load_promises(loginStrings, "loginStrings") 
      .then(function(){ 
      load_promises(logoutStrings, "logoutStrings"); 
      }).then(function(){ 
      Promise.all(promises.logoutStrings); 
      }) 
      .then(function(){ 
      Promise.all(promises.logoutStrings) 
      console.log("LOGIN PROMISES: " + promises.loginStrings.length); 
      console.log("LOGOUT PROMISES: " + promises.logoutStrings.length); 
      console.log("TOGGLE LOGIN PROMISES: " + promises.toggle_in.length); 
      console.log("TOGGLE LOGOUT PROMISES: " + promises.toggle_out.length); 
      }) 
      .then(function(){ 
      console.log("STRING_TALLY:") 
      console.log(string_tally); 
      resolve(string_tally.loginStrings < string_tally.logoutStrings) 
      }); 
     } 
     } 
    ) 
    } 

出力:私は(少なくとも1本のマッチを持つべきサイト上でこれをテストしている、すなわち要素がFOUND

.pw_is_present: false 
0) 
1) 
2) 
3) 
4) 
5) 
6) 
7) 
8) 
9) 
10) 
11) 
12) 
13) 
14) 
15) 
16) 
17) 
18) 
19) 
20) 
21) 
22) 
23) 
24) 
[ Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> } ] 
0) 
1) 
2) 
3) 
4) 
5) 
6) 
7) 
8) 
9) 
10) 
11) 
12) 
13) 
[ Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> }, 
    Promise { <pending> } ] 
LOGIN PROMISES: 25 
LOGOUT PROMISES: 14 
TOGGLE LOGIN PROMISES: 0 
TOGGLE LOGOUT PROMISES: 0 
STRING_TALLY: 
{ loginStrings: 0, logoutStrings: 0, toggle_in: 0, toggle_out: 0 } 
ELEMENTS FOUND: false 
login NOT FOUND 
ELEMENTS FOUND: false 
sign out NOT FOUND 
ELEMENTS FOUND: false 
Login NOT FOUND 
ELEMENTS FOUND: false 
Sign out NOT FOUND 
ELEMENTS FOUND: false 
LOGIN NOT FOUND 
ELEMENTS FOUND: false 
Sign Out NOT FOUND 
ELEMENTS FOUND: false 
Log in NOT FOUND 
ELEMENTS FOUND: false 
SIGN OUT NOT FOUND 
ELEMENTS FOUND: false 
Log In NOT FOUND 
ELEMENTS FOUND: false 
signout NOT FOUND 
ELEMENTS FOUND: false 
LOG IN NOT FOUND 
ELEMENTS FOUND: false 
Signout NOT FOUND 
ELEMENTS FOUND: false 
log in NOT FOUND 
ELEMENTS FOUND: false 
SIGNOUT NOT FOUND 
ELEMENTS FOUND: false 
signin NOT FOUND 
ELEMENTS FOUND: false 
log out NOT FOUND 
ELEMENTS FOUND: false 
Signin NOT FOUND 
ELEMENTS FOUND: false 
Log out NOT FOUND 
ELEMENTS FOUND: false 
SIGNIN NOT FOUND 
ELEMENTS FOUND: false 
Log Out NOT FOUND 
ELEMENTS FOUND: false 
sign in NOT FOUND 
ELEMENTS FOUND: false 
LOG OUT NOT FOUND 
ELEMENTS FOUND: false 
Sign in NOT FOUND 
ELEMENTS FOUND: false 
logout NOT FOUND 
ELEMENTS FOUND: false 
Sign In NOT FOUND 
ELEMENTS FOUND: false 
Logout NOT FOUND 
ELEMENTS FOUND: false 
SIGN IN NOT FOUND 
ELEMENTS FOUND: false 
LOGOUT NOT FOUND 
ELEMENTS FOUND: false 
log on NOT FOUND 
ELEMENTS FOUND: false 
Log on NOT FOUND 
ELEMENTS FOUND: false 
Log On NOT FOUND 
ELEMENTS FOUND: false 
LOG ON NOT FOUND 
ELEMENTS FOUND: false 
logon NOT FOUND 
ELEMENTS FOUND: false 
Logon NOT FOUND 
ELEMENTS FOUND: false 
LOGON NOT FOUND 
ELEMENTS FOUND: false 
logon id NOT FOUND 
ELEMENTS FOUND: false 
Logon id NOT FOUND 
ELEMENTS FOUND: false 
Logon Id NOT FOUND 
ELEMENTS FOUND: false 
LOGON ID NOT FOUND 

:真

しないでくださいその取引が何であるか知っておいてください。

私はこのように尋ねる方法はわかりませんここに何か好きなことがあれば、私はその問題に関するさらなる質問に答えることができます。

+0

Promise.all(promises.logoutStrings)は約束をするようですが、何もしていません。あなたがすべきこと:... '.then(()=> {Promise.all(promises.logoutStrings);)を返します。((arrOfLogoutStrings)=> {//ここでは、 ; ' – cnishina

答えて

1

Promise.all(promises.logoutStrings)およびPromise.all(promises.logoutStrings)は、正しく使用しても、あなたにはあまり役に立たないでしょう。 linkTextがallの文字列で見つかった場合、2つの集計された約束はそれぞれの成功パスに従うだけで、あなたが望むものではなく、現実的には決して起こりません。

のいずれかの文字列のリンクを見つけることに応じて解決すると約束しますので、raceToResolve(...)(2回)の機能が必要です。そのときだけ、Promise.all()を使用して2つのレースを集約します。

はまた、load_promises()したがって約束を返す必要があり、load_promises()からマッピングされた配列を返すことによって、外側の変数に対して必要login_promisesなどが消えない、同期しています。

あなたが書くことができ

var loginStrings = [.....]; // big array of "login" variants 
var logoutStrings = [.....]; // big array of "logout" variants 

function raceToResolve(arr) { 
    return new Promise(function(resolve, reject) { 
     var errCount = 0; 
     arr.forEach(function(p) { 
      p.then(
       function(val) { resolve(val); }, 
       function(err) { 
        errCount++; 
        if (errCount === arr.length) { 
         reject(0); 
        } 
       } 
      ); 
     }); 
    }); 
} 

function getStringExistsCount(string) { 
    return element(by.linkText(string)).isPresent(); 
} 
function load_promises(arr, successCode) { 
    return arr.map(getStringExistsCount).then(function(el) { 
     if(el) { return successCode; } // found 
     else { throw new Error(); } // not found 
    }); 
} 

function login_check() {} 

login_check.prototype.is_account_logged_in = function(pw) { 
    if(pw) { 
     return Promise.resolve(false); 
    } else { 
     var loggedInPromise = firstToResolve(load_promises(loginStrings, 1)); 
     var loggedOutPromise = firstToResolve(load_promises(logoutStrings, 2)); 
     return Promise.all([loggedInPromise, loggedOutPromise]) 
     .then(function(results) { 
      var compositeCode = results[0] | results[1]; // bitwise `|` will give 0(indeterminate), 1(loggedIn), 2(loggedOut) or 3(ambiguous). 
      return compositeCode === 1; // will return `true` if unambiguously logged in, otherwise false. 
      // alternatively, expose the compositeCode itself 
      // return compositeCode; 
     }); 
    } 
} 

私はtoggleInOutStringsを行うには、すべてを省略。たぶん私は何かが欠けているかもしれませんが、 "signin/out"という形式のリンクが存在する/していないと、ログインしているかどうかを判断できません。

+0

ねえ...あなたのご意見ありがとうございます。私はこれを差し込み、それがどうなるかを見てみよう。私は過去に分度器の缶詰めの方法だけを使用していましたが、私のニーズはそれを上回っています。副注釈として... toggleInOutStringsは、私が別の種類の入力を探していることを除いて、私が投稿したのと同じように動作します。私はそれを実装する前に上記を整理しておきたいと思っています。再度、感謝します。 – TheCulprit

+0

@TheCulprit、これをもう一度見て、私のコードは正しくありません。私はよりうまくやって、それに取り組んでいます。 –

+0

'race '(実質的に" raceToSettle() ")を別名の' raceToResolve() '関数に置き換えて編集しました。 –