自动填写 webview 中的字段

Posted

技术标签:

【中文标题】自动填写 webview 中的字段【英文标题】:Fill fields in webview automatically 【发布时间】:2011-12-19 04:20:05 【问题描述】:

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

据我了解,这可以通过使用 loadUrl(javascript) 进行 java 注入来完成,但我不知道填充字段的 java 命令是什么。对ios 提出了同样的问题,但命令略有不同。

是否可以在 webivew 中使用 javascript 完成我要求的操作,或者我是否必须在没有 webview 的情况下进行 http-post,例如 this 或 this?

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

【问题讨论】:

【参考方案1】:

感谢大家的回答,它帮助了我,但没有奏效。

在我找到这个之前,它总是打开一个白页:

https://***.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 程序员应该很容易解释这种行为...

希望这会有所帮助

【讨论】:

我没有对你投反对票,但我怀疑投反对票的原因是:“感谢大家的回答,它帮助了我,但没有用。”听起来这个答案是“我也是”的回应。 @Giova 请看这个,***.com/questions/37644551/…。它真的需要帮助。 此答案适用于 Webview 中的所有 javascript 注入情况。因此它应该被标记为正确的。 这应该是公认的答案,我在没有启用无用变量和 dom 存储的情况下得到一个空白屏幕。 嗨,你知道为什么这不起作用吗? pastebin.com/fV9NiSNy Google 搜索文本框永远不会被填满【参考方案2】:

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

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

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

【讨论】:

感谢您的回复。我现在可以填写用户名和密码字段,但无法激活登录按钮。到目前为止,我已经尝试过 "document.getElementById('submit').disabled = false" 和 "document.loginForm.submit.disabled = false" 和 "document.forms['loginForm'].submit()" 但没有一个已经工作了。知道为什么他们不这样做吗?谢谢。 在 Javascript 论坛中提问 XD 我其实对 JS 不太了解 嘿。你能参考任何完整的例子吗?我以前没有使用过这种代码。 @Cristian 请看这个问题 - ***.com/questions/37644551/…。它真的需要帮助。 嗨,你知道为什么这不起作用吗? pastebin.com/fV9NiSNyGoogle 搜索文本框永远不会被填满【参考方案3】:

这对我来说可以填写表单值并提交表单:

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

【讨论】:

【参考方案4】:

这是对我有用的完整代码 (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);
    

);

【讨论】:

感谢您的回答,因为这是唯一显示完整代码的示例,特别是必须等待页面加载的示例。这对我来说并不清楚。以及需要从加载的页面访问“视图”。【参考方案5】:

我尝试了@user802467 解决方案。但有两件事发生了不同的行为

    如果我只将最后一个 javascript 调用存储在变量中,则它不会填充字段。相反,如果我将所有三个调用都存储在变量中,它确实 由于某种原因,我的表单没有使用 submit() 提交。但是,如果我使用 button.click() 单击提交按钮,而不是提交表单,我不需要存储所有三个调用,并且一切正常!

这是我用过的(但没用)

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();"
           );

【讨论】:

【参考方案6】:

对我有用

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

【讨论】:

以上是关于自动填写 webview 中的字段的主要内容,如果未能解决你的问题,请参考以下文章

WebView(Android App)中弹出的模态对话框中的自动填充文本字段

WebView - 填写表格

带有 Javascript 的 WebView 不断重新加载

Android中WebView中的文本字段被键盘隐藏

在 Android 中填写表单数据

单击 WebView 中的表单字段时禁用缩放?