【问题标题】:fill form programmatically in Android Webview - JavaScript在 Android Webview 中以编程方式填写表单 - JavaScript
【发布时间】:2014-09-18 14:38:11
【问题描述】:

我正在尝试从我学校的网站自动填写表格。 我已经看到了一些使用 javascrip 的方法。

这是我的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.navegador_siiau_layout);

    navegador_siiau = (WebView) findViewById(R.id.wv_navegador_siiau);
    navegador_siiau.getSettings().setJavaScriptEnabled(true);
    navegador_siiau.loadUrl("http://siiauescolar.siiau.udg.mx/wus/gupprincipal.inicio");
    navegador_siiau.setWebViewClient(new WebViewClient() {
        public void onPageFinished(WebView view, String url) {
            String user="207512134";
            String pwd="FENMAA";
            view.loadUrl("javascript:document.getElementsByName('p_codigo_c').value = '"+user+"';document.getElementsByName('p_clave_c').value='"+pwd+"';");
        }
    });



}

结果是一个空白页面,其中包含我尝试放入表单的最后一个字符串... 如何正确填写和提交表格?

【问题讨论】:

    标签: java javascript android webview


    【解决方案1】:

    这是未经测试的,但我发现这里有两点错误:

    1. 在调用loadUrl 之前,您应该使用WebViewClient 实现调用setWebViewClient。然而,loadUrl 是异步的,所以它可能不会有什么不同,但我认为这值得一试。

    2. 您没有在 onPageFinshed 中调用 super.onPageFinished(view, url);。你应该添加这个调用。

    编辑 2:

    我终于查看了您正在使用的实际页面。问题是页面在不同的框架中加载内容,因此您实际上必须对不同的文档进行getElementsByName 调用。您想要的两个输入所在的框架在您的页面中具有名称mainFrame。因此,您应该像上面那样编写 javascript 并将其加载到 WebView 中:

    window.frames["mainFrame"].document.
                     getElementsByName('p_codigo_c')[0].value = "user";
    window.frames["mainFrame"].document.
                     getElementsByName('p_clave_c')[0].value = "password";
    

    【讨论】:

    • 当我使用这个时: document.getElementsByName('p_codigo_c')[0].value 什么也没发生,但是当我使用时: document.getElementsByName('p_codigo_c').value 一个新网页打开我作为值输入的字符串
    • @OscarMéndez 我看了看页面。问题是您没有在框架内搜索。我已经编辑了我的答案。我测试了这个解决方案,它可以在桌面网络浏览器中运行。我认为它也适用于 WebView。
    • 感谢您花时间检查网页并帮助我解决这个问题!
    • 没问题,很高兴听到有帮助!
    【解决方案2】:

    这适用于大于 18 的 API 版本

     mWebView = findViewById(R.id.web_view);   
            String url = "https://duckduckgo.com";
    
            mWebView.loadUrl(url);  
            mWebView.getSettings().setJavaScriptEnabled(true);
    
            final String js = "javascript:document.getElementById('search_form_input_homepage').value='android';" +
                    "document.getElementById('search_button_homepage').click()";
    
            mWebView.setWebViewClient(new WebViewClient(){
    
                public void onPageFinished(WebView view, String url){
                    if(Build.VERSION.SDK_INT >= 19){
                        view.evaluateJavascript(js, new ValueCallback<String>() {
                            @Override
                            public void onReceiveValue(String s) {
                            }
                        });
                    }
                }
            });
    

    这里重要的是 view.evaluateJavascript

    【讨论】:

    【解决方案3】:

    你只需要启用 domelements

          myview.getSettings().setDomStorageEnabled(true);
    

    然后使用getelementby id like

         javascript:var x = document.getElementById('myfield').value = 'aaa';
    

    然后在

             onPageFinishedLoading(){}
    

    从链接Android WebView always returns null for javascript getElementById on loadUrl得到这个

    【讨论】:

      【解决方案4】:

      对我来说,需要在回调时一一填写表单中的多个条目 每个“webView.evaluateJavascript” 注意:API 版本 > 18

      参考下面的sn-p

      ArrayList<String> arr = new ArrayList<String>();
      arr.add("document.getElementsByName(\"tag_name\")[0].value  = \"your_value\";");
      .
      .
      .
      call setValue(arr, 0)
      
      private void setValue(final ArrayList<String> arr, final int i) {
              if (i < arr.size()) {
                  webView.evaluateJavascript(arr.get(i), new ValueCallback<String>() {
                      @Override
                      public void onReceiveValue(String value) {
                          int j = i + 1;
                          setValue(arr, j);
                      }
                  });
              }else{
                  webView.evaluateJavascript("document.getElementById(\"your_form_id\").submit();", new ValueCallback<String>() {
                      @Override
                      public void onReceiveValue(String value) {
                          Toast.makeText(MainActivity.this, "Submitted: "+value, Toast.LENGTH_SHORT).show();
                      }
                  });
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2022-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-15
        • 1970-01-01
        • 1970-01-01
        • 2013-02-26
        相关资源
        最近更新 更多