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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    希望这会有所帮助

    【讨论】:

    • 我没有对你投反对票,但我怀疑投反对票的原因是:“感谢大家的回答,它帮助了我,但没有用。”听起来这个答案是“我也是”的回应。
    • @Giova 请看这个,stackoverflow.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 请看这个问题 - stackoverflow.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 解决方案。但有两件事发生了不同的行为

      1. 如果我只将最后一个 javascript 调用存储在变量中,则它不会填充字段。相反,如果我将所有三个调用都存储在变量中,它确实
      2. 由于某种原因,我的表单没有使用 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);
        

        【讨论】:

          猜你喜欢
          • 2013-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-25
          • 1970-01-01
          • 2012-04-21
          相关资源
          最近更新 更多