填写网站数据并单击按钮并解析响应

时间:2016-09-26 11:34:27

标签: javascript java android

我想让用户输入车辆编号,然后读取数据并向用户显示车辆详细信息。我不想在webview中这样做。我可以使用以下代码填充数据:

webView = (WebView) findViewById(R.id.webView1);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl("https://parivahan.gov.in/rcdlstatus/vahan/rcstatus.xhtml");
        webView.setWebViewClient(new WebViewClient() {
            public void onPageFinished(WebView view, String url) {
                String reg1="KA51X";
                String reg2="2442";
                 if(isFirstLoad) {
                     webView.loadUrl("javascript: {" +
                             "document.getElementById('convVeh_Form:tf_reg_no1').value = '" + reg1 + "';" +
                             "document.getElementById('convVeh_Form:tf_reg_no2').value = '" + reg2 + "';" +
                             "var frms = document.getElementsByName('convVeh_Form');" +
                             "frms[0].submit(); };");

                     isFirstLoad = false;
                 }
            }
        });

以下是显示此应用数据的网站。

https://parivahan.gov.in/rcdlstatus/vahan/rcstatus.xhtml

现在我尝试使用此行点击提交按钮

 "frms[0].submit(); };");

这个,

"javascript:(function(){document.getElementById('convVeh_Form:j_idt21').click();})()"

但他们没有工作。如何单击Id为

的按钮
  

convVeh_Form:j_idt21

此外,一旦能够点击按钮,响应将来自网站。如何阅读该响应文本并将其放在app的textview中?

3 个答案:

答案 0 :(得分:2)

您遇到了一个单独的问题,convVeh_Form:j_idt21只是一个标签(在撰写本文时)。你想要convVeh_Form:j_idt27。也许他们改变了?

您可能希望将注入的javascript和选择器设置为document.querySelector('[id="convVeh_Form:j_idt27"]').click()

为了css选择器的目的,这会使:成为一个特殊字符。

webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("https://parivahan.gov.in/rcdlstatus/vahan/rcstatus.xhtml");
webView.setWebViewClient(new WebViewClient() {
  public void onPageFinished(WebView view, String url) {
    String reg1 = "KA51X";
    String reg2 = "2442";
    if (isFirstLoad) {
      webView.loadUrl("javascript: {" +
        "document.getElementById('convVeh_Form:tf_reg_no1').value = '" + reg1 + "';" +
        "document.getElementById('convVeh_Form:tf_reg_no2').value = '" + reg2 + "';" +
        "document.querySelector('[id=\"convVeh_Form:j_idt27\"]').click(); };");

      isFirstLoad = false;
    }
  }
});

你也可以使用button[type="submit"]作为选择器,如果你知道它总是第一个按钮,那么ID就不再重要了。 (也许他们会再次改变?)其他字段为document.querySelectorAll('input[type="text"]')[0][1]

提交表单后,导航将会更改。这会触发您可以通过继承WebView来挂钩的事件。有关示例,请参阅this answer了解其他问题。

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // ...
    }
}

将其用作事件,检测端点上的URL,然后注入一些新的javascript以从页面中提取信息。如果您需要更多帮助,请告诉我。

答案 1 :(得分:2)

我发现正确的ID是convVeh_Form:j_idt26而不是

  

"的javascript:(函数(){的document.getElementById(' convVeh_Form:j_idt21')点击();})()"

请检查我的link以证明

因此,我的主要建议是在将其添加到Android之前在浏览器中测试您的JS代码。 Chrome中的调试模式对此非常有用,我相信您知道如何启用它。

之后如果您确定JS代码运行良好,请通过逻辑块将代码添加到Android。这可以帮助您调试它。

例如,首先将以下几行放在JS代码中:

  

document.getElementById(' convVeh_Form:tf_reg_no1')。value =' text'          document.getElementById(' convVeh_Form:tf_reg_no2')。value =' text'

如果您在设备上看到了结果,则应添加点击事件。

  

的document.getElementById(' convVeh_Form:j_idt26&#39)。单击()

它可以分离你的JS逻辑,你将确定代码实际上有什么问题。

关于这一行:

  

此外,一旦能够点击按钮,响应将来自网站。如何阅读该响应文本并将其放在app的textview中?

您应该实现自己的WebViewClient()并覆盖onPageFinished并仅在正确的页面上运行JS代码。

@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    if("https://parivahan.gov.in/rcdlstatus/vahan/rcstatus.xhtml".equals(url)) {
        // run JS
    } else if("response_link".equals(url)) {
        // notify user or any other logic
    }
}
祝你好运!

P.S。上面的所有JS代码都适用于我这边的浏览器。

答案 2 :(得分:0)

如何点击Id为convVeh_Form的按钮:j_idt21

$('#convVeh_Form:j_idt21').click();

如何阅读该响应文本并将其放入app的textview中? 如果是提交表单,那么此消息将更容易使用ajax调用:

$.ajax({
   url: "http://your.url",
})
.done(function( data ) {
   $('#textview').text(data);
});