在Android Webview中以编程方式填写表单 - JavaScript

时间:2014-07-27 03:58:32

标签: java javascript android webview

我试图从我学校的网站上自动填写表格。 我已经看到了一些与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+"';");
        }
    });



}

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

4 个答案:

答案 0 :(得分:2)

这是未经测试的,但我认为这里有两件事:

  1. 在致电setWebViewClient之前,您应该使用WebViewClient实施方式致电loadUrl。但是,loadUrl是异步的,所以它可能没什么区别,但我认为这值得一试。

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

  3. 编辑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";
    

答案 1 :(得分:0)

您只需要启用内容

      myview.getSettings().setDomStorageEnabled(true);

然后使用getelementby id,如

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

并在

中执行此操作
         onPageFinishedLoading(){}

从链接Android WebView always returns null for javascript getElementById on loadUrl

获取此信息

答案 2 :(得分:0)

这适用于我的API版本大于18

 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 :(得分:0)

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

请参见下面的代码片段

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