使用JavaScript在WebView中填写表单

14
我正在尝试在Android的Webview中填写Webforms。 我已经在这里找到了这段代码:Fill fields in webview automatically
String username = "cristian";
webview.loadUrl("javascript:document.getElementById('username').value = '"+username+"';");

很不幸,我不明白在哪里打开我想要填写的页面。

setContentView(R.layout.web);
final WebView mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl(url);
String user="u";
String pwd="p";
mWebView.loadUrl("javascript:document.getElementById('username').value = '"+user+"';document.getElementById('password').value='"+pwd+"';");

我尝试了这种方式,网站被显示出来了,但表单中没有任何值。

提前感谢您的帮助。


嗨。你能否提供一个完整的例子参考一下?我以前没有接触过这种代码。 - Sagar Nayak
4个回答

25

Android 4.4 的新 WebView 存在使用 loadUrl("javascript:") 方法的问题,参数字符串会在执行前进行 URL 解码。 可以尝试使用 API >= 19 的 evaluateJavascript() 方法和 API < 19 的 loadUrl() 方法。 下面的代码对我有效。

    mWebView.loadUrl(url)
    WebSettings settings = mWebView.getSettings();
    settings.setJavaScriptEnabled(true);

    String js = "javascript:document.getElementById('username').value = '"+user+"';document.getElementById('password').value='"+pwd+"';";
    mWebView.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);

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

                    }
                });
            } else {
                view.loadUrl(js);
            }
       });
    }
请参考:loadUrl("javascript:....")在Android 4.4中行为发生了不兼容的变化

请考虑编辑您的帖子,添加更多关于代码的解释以及为什么它能解决问题的说明。大多数只包含代码(即使代码能运行)的答案通常不能帮助提问者理解他们的问题。 - SuperBiasedMan
@awind,我可以在发送表单数据后获取Ajax响应吗?表单网页从远程URL在Webview中显示。 - Mansukh Ahir
我认为版本检查有些过度(因为loadUrl仍然存在并在后续版本中运行,evaluateJavascript只有在需要获取返回值时才“必需”),但是显然他们引入了一些错误,导致它解析方式不同或其他问题 https://issuetracker.google.com/issues/36995865 ,所以这可能仍然是好的 :) - rogerdpack

22

页面加载后再填写数值。以下是使用您的代码的示例:

mWebView.loadUrl(url);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new WebViewClient() {
    public void onPageFinished(WebView view, String url) {
        String user="u";
        String pwd="p";
        view.loadUrl("javascript:document.getElementById('username').value = '"+user+"';document.getElementById('password').value='"+pwd+"';");
    }
});

我已经尝试使用您的代码。网页正在加载,但是这些字段没有被填充数据,它们仍然是空的。您能告诉我如何编写JavaScript代码来解决这个问题吗? - user1213202
您可以为元素“用户名”或“密码”选择不同的名称。您应该将这些名称替换为您网页上实际字段的名称。 - gnpaolo
嗨,你能否提供一个完整的例子吗?我以前没有接触过这种代码。 - Sagar Nayak
awind的答案应该被认为是正确的答案! - pepan
1
我已经尝试过了,当我通过1个ID时,它运行正常,但是当我通过2个以上的ID时,由于“;”而打印出值,而不是显示网页。有什么想法是什么问题? - Neal

2
只需启用DomStorage并将“var x=”写入字符串即可:
webview.getSettings().setJavaScriptEnabled(true);
web.getSettings().setDomStorageEnabled(true);

webview.loadUrl(urlString);
webview.setWebViewClient(new WebViewClient(){

public void onPageFinished(WebView view, String url){  
super.onPageFinished(view, url);
String js = "javascript:var x=document.getElementById('username').value = '"+user+"';var y=document.getElementById('password').value='"+pass+"';";

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

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

view.loadUrl(js);
}
});

1
我之前也遇到了同样的问题,通过查看stackOverflow上不同的解释后,终于让我的工作起了作用。
以下是我的解决方案。
webView.loadUrl(url);
        webView.getSettings().setDomStorageEnabled(true);
        webView.setWebViewClient(new WebViewClient(){
            public void onPageFinished(WebView view, String url) {
                String email="email@email.jp";

                //view.loadUrl("javascript:document.getElementById('email').value = '"+email+"'");
                view.loadUrl("javascript:document.forms[0].email.value = '"+email+"';");
                Log.d("email", "can not add email");
            }
        });

两件事情: 1)您需要添加此行 webView.getSettings().setDomStorageEnabled(true);(参考:Android WebView always returns null for javascript getElementById on loadUrl) 2)您需要使用此代码访问php代码中的变量:view.loadUrl("javascript:document.forms[0].email.value = '"+email+"';");,正如您在我的代码中所看到的,我使用了@gnpaolo提出的解决方案,但对我没有起作用,因此我进行了评论并使用了这个解决方案。(参考:How to inject a String into Android WebView) 最后,只是想补充一点,您不需要创建一个特殊的javascript。

还有一件事,forms[0] 是php表单中变量的位置,在我的情况下,我有用户的电子邮件,所以我写了 view.loadUrl("javascript:document.forms[0].email.value = '"+email+"';");

希望这对其他人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接