2015-03-22 4 views
0

Как проверить в Android WebView, если логин не удался или был успешным? На веб-странице входа в систему отображается следующее сообщение, когда логин завершился неудачно из-за неправильного имени пользователя и/или пароля.Ошибка входа в систему Android-WebView Javascript

<div id="errorMsgId1427032461760" class="errorMessage"> 

Как это проверить, используя JavaScript? (вызов следующего действия работает, но он всегда вызывает следующую активность. Поэтому я хочу запустить эту проверку).

EDIT: Я пробовал добавить JavaScript-интерфейс в webView.loadURL(), но это не сработало.

webView.loadUrl("javascript: if(document.body.innerHTML.toString().indexOf('Invalid') > -1){\n" + 
        "   JSInterface.changeActivity() ;"); 

EDIT 2: Как использовать?

if(document.body.innerHTML.toString().indexOf("invalid") > -1){ alert("invalid'"); 

, а затем вызвать намерение, если предупреждение не вызывается. (Предупреждение может быть любой функцией).

EDIT 3:

Я попытался с onConsoleMessage, но он не работает. Вот код:

webView.setWebChromeClient(new WebChromeClient() {@ 
Override 
public boolean onConsoleMessage(ConsoleMessage cm) { 
    String a = cm.toString(); 
    if (a.equalsIgnoreCase("Success")) { 
     Toast.makeText(Login.this, "Login Successful", Toast.LENGTH_SHORT).show(); 
     Intent intent = new Intent(Login.this, Upload.class); 
     Login.this.finish(); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     startActivity(intent); 
    } 
    if (a.equalsIgnoreCase("Error")) { 
     Toast.makeText(Login.this, "Please enter correct credentials", Toast.LENGTH_LONG).show(); 
    } 
    return true; 
} 
}); 

и onPageFinished способ, как:

webView.setWebViewClient(new WebViewClient() { 
     @TargetApi(Build.VERSION_CODES.KITKAT) 
     @Override 
     public void onPageFinished(WebView view, final String url) { 

     webView.loadUrl("javascript: if (document.querySelectorAll('[type=submit]').length) {\n" + 
        " var x = document.querySelectorAll('[type=submit]');\n" + 
        " x[0].addEventListener(\"click\", function() {\n" + 
        "  if (document.body.innerHTML.toString().indexOf(\"Invalid\") > -1) console.log(\"Error\");\n" + 
        "  else console.log(\"Success\");\n" + 
        " });};"); 
     return true; 
     } 
    }); 

    webView.getSettings().setJavaScriptEnabled(true); 
    webView.loadUrl("http://192.168.0.101:9999/user"); //Local URL. 

Я проверил выше Javascript с предупреждением вместо console.log и она работает.

Что такое ошибка? Я не могу понять.

+0

В yt 'javascript:' url, вы оставили фигурные скобки незамкнутыми - нужно добавить '}' после 'JSInterface.changeActivity();'. Кроме того, перед загрузкой страницы вам необходимо ввести 'JSInterface' через« WebView.addJavascriptInteface ». –

+0

Спасибо, я перепроверяю код и проверяю его. Скоро сообщу. – javaEntu

+0

@ МихаилаНаганова это не сработало. Я ввел JSInterface как «JavaScriptInterface JSInterface; JSInterface = new JavaScriptInterface (this); webView.addJavascriptInterface (JSInterface, «JSInterface»); ' – javaEntu

ответ

0

Что-то вроде этого:

webView.setJavaScriptEnabled(true); 
webView.setWebViewClient(new WebViewClient() { 
    @Override 
    public void onPageFinished(WebView view, String url) { 
     if (!<login page url>.equals(url)) return; 
     // Available on KitKat and later 
     view.evaluateJavascript(
      "document.getElementsByClassName('errorMessage').length", 
      new ValueCallback<String>() { 
       @Override 
       public void onReceiveValue(String errorMessageCount) { 
        if ("0".equals(errorMessageCount)) { 
         // all ok 
        } else { 
         // error message detected 
        } 
       } 
      } 
     ); 
    } 
}); 

Если вы целевой предварительно KitKat релизы, то вам придется использовать более сложный способ, чтобы получить результат обратно из JS, что-то, как описано здесь: How to get return value from javascript in webview of android?

+0

Да, я также планирую выпуск pre-KitKat, но я попробую это. – javaEntu

+0

Нет, это не сработало. Я поместил свой код Intent в **, если его часть, то он активировал новый Intent ** _ без загрузки страницы входа_, тогда как в части «else else» он вообще не работал. ** Как это использовать? 'if (document.body.innerHTML.toString(). indexOf (" invalid ")> -1) { alert (" invalid '");' и ** затем вызвать Intent, если предупреждение не вызывается **. _ (Предупреждение может быть любой функцией) ._ – javaEntu

+0

@javaEntu: Если вы загружаете другие страницы, помимо страницы входа, код в ветке 'all ok' также скорее всего будет срабатывать для них, потому что у них нет элемента с классом 'errorMessage'. Вы должны добавить проверку, запускается ли 'onPageFinished' для страницы входа. Я добавил это к моему примеру. –

Смежные вопросы