自动填写webview中的字段

时间:2011-11-01 01:20:33

标签: java android webview http-post android-webview

我已经看到这个问题浮现在互联网上,但我还没有找到可行的解决方案。基本上,我想加载我的应用程序并按下按钮;然后按钮操作将在已经加载到webview中的网站中填写用户名和密码(或等待onPageFinished)。最后,将激活登录页面上的提交按钮。

根据我的理解,这可以通过使用loadUrl(javascript)进行java注入来完成,但我不知道填写字段的java命令是什么。同样的问题被问到iOS,但命令略有不同。

是否有可能在webivew中使用javascript执行我要求的操作,或者我是否必须在没有thisthis等网络视图的情况下执行http帖子?

非常感谢您提供任何帮助!

6 个答案:

答案 0 :(得分:28)

感谢大家的回答,这对我很有帮助,但没有成功。

总是打开一个白页,直到我发现:

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

所以这里有完整的解决方案,混合所有在这里和那里找到的信息:

1)首先你必须启用DOM存储,如果不这样做,.GetElementByXXX将不返回任何内容(你必须在之前加载页面)

myWebView.getSettings().setDomStorageEnabled(true);

2)您在GetElementByXXX上的最后一次Javascript调用必须将结果存储在变量中

例1:

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

这里只有一个电话(只有一个分号)所以我们立即将结果存储在'uselessvar'中

示例2:请参阅user802467答案

这里有3个电话(一个用于登录字段,一个用于密码字段,一个用于提交按钮),只有最后一个电话需要存储,它是在'frms'中完成的

Javascript程序员应该很容易解释这种行为......

希望这会有所帮助

答案 1 :(得分:19)

您不需要使用“java命令”......而是使用JavaScript ...例如:

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

所以基本上,你需要做的是一大串JavaScript代码,它们将获取这些字段并将值放在它们上面;此外,您可以从JavaScript启用/禁用提交按钮。

答案 2 :(得分:18)

这对我填写表单值并提交表单非常有用:

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

答案 3 :(得分:9)

以下是适合我的完整代码(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);
    }
}

});

答案 4 :(得分:0)

我尝试了@ user802467解决方案。但是在2件事上有不同的行为

  1. 如果我只在变量中存储了最后一个javascript调用,那么它就不会填充字段。相反,如果我将所有三个调用存储在变量中,它就会
  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();"
               );
    

答案 5 :(得分:0)

对我有用

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