2013-05-23 20 views
14

Ho un sito web con href in essa che mi ha reindirizzato a HTTPSprogrammatica click in Android WebView

<a id="mA" href="javascript:pLogin(2)" class="login-link__link private-cab-link"><i class="icon-user"></i>Авторизация</a> 

Quindi, posso cliccare su di esso da JavaScript. Funziona in console cromata

javascript:(function(){document.getElementById('mA').click();})() 

Ora sto cercando di fare lo stesso in WebView facendo clic sul pulsante di mia app.

public class RostelecomLoginActivity extends Activity { 

    WebView webView; 
    String url; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.getWindow().requestFeature(Window.FEATURE_PROGRESS); 
     setContentView(R.layout.activity_rostelecom_login); 
     Intent webIntent = getIntent(); 
     String url = webIntent.getStringExtra("url"); 

     webView = (WebView) findViewById(R.id.webView1); 
     webView.setWebViewClient(new MeWebViewClient()); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.getSettings().setSaveFormData(true); 
     webView.getSettings().setSavePassword(true); 
     webView.loadUrl(url); 

     Button buttoner = (Button) findViewById(R.id.button1); 
     buttoner.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       webView.loadUrl("javascript:(function(){document.getElementById('mA').click();})()"); 
      } 
     }); 

    } 

} 

sto usando MyWebViewClient per consentire a tutti i certificati

public class MeWebViewClient extends WebViewClient { 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     view.loadUrl(url); 
     return true; 
    } 

    @Override 
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { 
     handler.proceed(); 
    } 
} 

Il js iniezione non funziona. Se clicco su href in WebView funziona. Cosa può essere sbagliato?

+1

perche a accetta una risposta La soluzione fornita da "deviato" funziona alla grande. L'ho provato Cordiali saluti – Lisitso

risposta

28

clic() non è implementata nell'interfaccia js Android, è necessario utilizzare HTML DOM oggetto evento, in questo modo:

webView.loadUrl("javascript:(function(){"+ 
    "l=document.getElementById('mA');"+ 
    "e=document.createEvent('HTMLEvents');"+ 
    "e.initEvent('click',true,true);"+ 
    "l.dispatchEvent(e);"+ 
    "})()"); 
+3

Dio vi benedica! Mi hai aiutato molto dopo molti giorni passati a scoprire la soluzione. Grazie mille – Lisitso

+0

@deviato: ciao, cosa succede se pulsante/href non hanno ID? potresti per favore dare una soluzione. nel mio esempio 'code ' Grazie –

+1

@JasbirBhinder in questo caso è semplicemente un problema javascript che puoi risolvere usando 'getElementsByClassName' o' getElementsByName', che restituiscono una matrice di oggetti. Ad esempio, se si ha un solo elemento con quel nome, è possibile utilizzare '" l = document.getElementsByName ('initCaseSearch'); "+' nel punto della seconda riga. – deviato

5

Dovrai aggiungere un'interfaccia javaScript allo WebView per chiamare una funzione JavaScript dal codice di Android.

provare qualcosa di simile: -

Button buttoner = (Button) findViewById(R.id.button1); 
    buttoner.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      JavascriptInterface javasriptInterface = new JavascriptInterface(RostelecomLoginActivity.this); 
      webView.addJavascriptInterface(javasriptInterface, "MyInterface"); 
      webView.loadUrl("javascript:(function(){document.getElementById('mA').click();})()"); 
     } 
    }); 
+0

Io uso l'API 17, nella documentazione ho visto che dovrei aggiungere annotazioni. Ma se aggiungo '@JavascriptInterface' prima del vuoto pubblico onClick, non funziona ancora perché non riesco a creare JavascriptInterface jsint = new JavascriptInterface (RostelecomLoginActivity.this); Impossibile istanziare il tipo JavascriptInterface (errore) – Valeriy

+0

@bakriOnFire Non penso che tu capisca cosa 'addJavascriptInterface' fa – njzk2

+0

@bakriOnFire Esiste comunque un elemento con il solo valore? Non c'è id o classe. – LUKER