web-dev-qa-db-ja.com

WebViewのフィールドに自動的に入力する

私はこの質問がインターネット上に浮かんでいるのを見てきましたが、実用的な解決策をまだ見つけていません。基本的に、私は自分のアプリをロードしてボタンを押したいです。ボタンアクションは、Webビューに既にロードされているWebサイトにユーザー名とパスワードを入力します(またはonPageFinishedを待ちます)。最後に、ログインページの送信ボタンがアクティブになります。

私が理解していることから、これはJavaインジェクションを実行することによって行うことができますが、Javaコマンドがどうなるかわかりません iOS についても同じ質問が出されましたが、コマンドは少し異なります。

私がwebivewでjavascriptを使用して求めていることを実行することは可能ですか、または this または this のようなwebviewなしでhttp-postを実行する必要がありますか?

あなたが与えることができるあらゆる助けを本当にありがとう!

20
user1022934

「Javaコマンド」を使用する必要はありませんが、代わりにJavaScriptなどを使用してください。

String username = "cristian";
webview.loadUrl("javascript:document.getElementById('username').value = '"+username+"';");

基本的に、これらのフィールドを取得して値を設定するJavaScriptコードの大きな文字列を作成する必要があります。また、JavaScriptから送信ボタンを有効/無効にすることもできます。

19
Cristian

あなたの答えをありがとう、それは私を助けましたが、うまくいきませんでした。

私がこれを見つけるまで、それは常に白いページを開いていました:

https://stackoverflow.com/a/25606090/3204928

ここに完全なソリューションがあり、あちこちで見つかったすべての情報を混合します:

1)まず、DOMストレージを有効にする必要があります。そうしないと、.GetElementByXXXは何も返しません(これを行う必要がありますbeforeページの読み込み)

myWebView.getSettings().setDomStorageEnabled(true);

2)GetElementByXXXでの最後のJavaScript呼び出し[〜#〜] must [〜#〜]結果を変数に保存する

例1:

_webview.loadUrl("javascript:var uselessvar =document.getElementById('passwordfield').value='"+password+"';");

ここでは1回の呼び出し(1つのセミコロンのみ)なので、すぐに結果を 'uselessvar'に格納します

例2:user802467の回答を参照

ここには3つの呼び出し(1つはログインフィールド、1つはパスワードフィールド、1つは送信ボタン)があり、最後の呼び出しのみを保存する必要があります。これは「frms」で行われます。

Javascriptプログラマーは、この動作を簡単に説明する必要があります...

これが役に立てば幸い

30
Giova

これは私がフォームの値を入力してフォームを送信するのに役立ちました:

webView.loadUrl("javascript: {" +
            "document.getElementById('username').value = '"+uname +"';" +
            "document.getElementById('password').value = '"+password+"';" +
            "var frms = document.getElementsByName('loginForm');" +
            "frms[0].submit(); };");
18
user802467

ここに私のために働く完全なコードがあります( Bitbucket ):

webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.loadUrl("http://example.com/");
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);

    final String password = "password";
    final String username = "username";
    final String answer = 5;

    final String js = "javascript:" +
            "document.getElementById('password').value = '" + password + "';"  +
            "document.getElementById('username').value = '" + username + "';"  +
            "var ans = document.getElementsByName('answer');"                  +
            "ans[0].value = '" + answer + "';"                                 +
            "document.getElementById('fl').click()";

    if (Build.VERSION.SDK_INT >= 19) {
        view.evaluateJavascript(js, new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String s) {

            }
        });
    } else {
        view.loadUrl(js);
    }
}

});

9
Viktor Apoyan

@ user802467ソリューションを試しましたが、2つの点で異なる動作がありました

  1. 変数に最後のJavaScript呼び出しのみを保存した場合、フィールドに入力されませんでした。代わりに、3つの呼び出しすべてを変数に格納した場合、
  2. 何らかの理由で、私のフォームがsubmit()を使用して送信されていませんでした。しかし、フォームを送信する代わりに、button.click()を使用して送信ボタンをクリックした場合、3つの呼び出しすべてを保存する必要はなく、すべてが完全に機能しました。

これが私が使ったものです(しかしうまくいきませんでした)

view.loadUrl("javascript: var x = document.getElementById('username').value = '" + username + "';" +
                        "var y = document.getElementById('password').value = '" + password + "';" +
                        "var form1 = document.getElementById('loginform');" +
                        "form1[0].submit(); ");

これは私のために働いたコードです

view.loadUrl("javascript:  document.getElementById('username').value = '" + username + "';" +
                           " document.getElementById('password').value = '" + password + "';" +
                           "var z = document.getElementById('submitbutton').click();"
           );
0
user5434084

わたしにはできる

webView.loadUrl("javascript:var uselessvar =document.getElementById('regno').value='"+mob+"';",null);
webView.loadUrl("javascript:var uselessvar =document.getElementById('passwd').value='"+pass+"';",null);
0
Eliter