【问题标题】:How to listen to elements changing in WebView using Jsoup?如何使用 Jsoup 监听 WebView 中的元素变化?
【发布时间】:2019-04-03 20:30:44
【问题描述】:

我正在尝试使用 Jsoup 检索隐藏的输入 HTML 元素的值,当用户未登录并且用户登录时(在 WebView 应用程序中),该值为“none”,它给出了他们的用户名,我成功地能够使用 Jsoup 获取我想要的元素,但是当他们实际登录并且元素的值不同于“none”时,我试图在 WebView 上侦听以获取元素的值,我使用 onPageStarted 和 onPageFinished 无济于事,因为当用户尚未登录时,他们一直向我发送原始值(无),这是我的 MainActivity

MainActivity.java

package com.gci.gestioncapteursincendie;

import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.InstanceIdResult;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    WebView webView;
    String webView_url;

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

       //storing webView defined in activity_main.xml inside a WebView instance webView
        webView = (WebView) findViewById(R.id.webview);

        //enabling js in the WebView
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);


        webView.setWebViewClient( new WebViewClientImpl(this){

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                new MyTask().execute();

            }
        });

        //defining the website the webView loads when the app is launched
        webView.loadUrl("http://gestioncapteursincendie.herokuapp.com");
        webView_url = webView.getUrl();




        FirebaseInstanceId.getInstance().getInstanceId()
                .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
                    @Override
                    public void onComplete(@NonNull Task<InstanceIdResult> task) {
                      if(task.isSuccessful()){
                          String token = task.getResult().getToken();
                          System.out.println("token: "+token);
                        }
                        else
                      {
                          System.out.println("Token Not Generated");
                      }
                    }
                });

        }
    private class MyTask extends AsyncTask<Void, Void, String> {

        @Override
        protected String doInBackground(Void... params) {
            Document doc = null;
            Element x = null;
            try {
                doc = Jsoup.connect(webView_url).get();
                x = doc.getElementById("loggedin");
            } catch (IOException e) {
                e.printStackTrace();
            }

            System.out.println("Webview url= " +webView_url);
            System.out.println("loggedin= " + x);
            return x.val();
        }


        @Override
        protected void onPostExecute(String result) {
            System.out.println("RESULT: "+result);
        }
    }
        }

【问题讨论】:

  • 您的问题解决了吗?如果没有,添加更多信息会很有帮助。如果已解决,请考虑接受答案并将此问题标记为已解决。
  • @luksch 嘿,很抱歉给您带来不便,我最终使用了 evaluateJavascript 方法而不是 Jsoup,它有效,我想我可能在错误的情况下使用了 Jsoup 并期望它检索结果它最初并不是为了返回而设计的;

标签: java android jsoup


【解决方案1】:

Jsoup 不是浏览器,它不与 WebView 同步(基本上是浏览器!)

因此,如果网站的完整状态反映在 URL 中,您将只能获得与 WebView 相同的内容,我对此非常怀疑,因为这对网站来说非常不安全。

所以这就是我认为你的代码中发生的事情(我没有仔细分析它):

  1. 您创建一个 WebView
  2. 在该 Web 视图中您登录。对于该表单,通常将 POST 请求发送到 Web 服务器,并且 Web 服务器通过在浏览器中设置几个 cookie 进行响应,以便您为下一个请求保持登录状态。但是,该页面的 URL 不会以让您接管该会话的方式发生变化。
  3. 通过使用 JSoup 的 http 连接功能连接到 Web 服务器,您可以创建一个与 Web 服务器的新会话。 Web 服务器响应一个站点,该站点当然没有登录用户。
  4. 您解析该页面 -> 未登录

你需要做什么:

  1. 同上
  2. 同上
  3. 找到检索当前加载页面的 HTML 的 WebView 函数,并使用它将所有内容放入字符串中
  4. 使用 JSoup 解析字符串。不要使用 JSoup 连接方法。
  5. 找到你要找的东西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2012-11-02
    • 2014-12-20
    • 1970-01-01
    • 2018-04-24
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多