2016-11-17 50 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) 
      }); 
     } 
     } 
    ) 
    } 

輸出:

.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);).then((arrOfLogoutStrings)=> {//這裏有一些很酷的你的完成promsies數組}}) ;' – cnishina

回答

1

Promise.all(promises.logoutStrings)Promise.all(promises.logoutStrings)即使正確使用也不會對您有太大用處。如果發現linkText爲全部字符串,這兩個彙總的承諾將僅遵循其各自的成功路徑 - 這不是您想要的,並且實際上不會發生。

你想要的是將在響應解決尋找一個鏈接字符串中的任何一個一個承諾,因此,你需要一個raceToResolve(...)功能(兩次)。只有這樣,纔可以使用Promise.all()來聚合兩個種族。

此外,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。也許我錯過了一些東西,但是我看不到表單「登錄/退出」鏈接的存在/缺失將有助於確定登錄/退出狀態。

+0

嘿...感謝您的意見。我會盡力將其插入,看看它是如何發展的。過去我只使用量角器的罐裝方法,但我的需求已經超出了他們。作爲一個附註...... toggleInOutStrings的工作方式與我發佈的非常相似,除了我將尋找一種不同類型的輸入。我只是想在實現它們之前將上述內容整理出來。再次感謝。 – TheCulprit

+0

@TheCulprit,再看一遍,我的代碼是不正確的。我可以做得更好,我正在努力。 –

+0

編輯,用定製的'raceToResolve()'函數替換'.race()'(實際上是「raceToSettle()」)。 –