在Android运行时中访问浏览器的DOM内容

Y.S*_*Y.S 8 html javascript jquery android dom

假设我们有一个标准的登录页面,如下所示:

在此处输入图片说明

我们可以像这样使用using 或plain中的HTML元素:DOMjQueryJavaScript

在此处输入图片说明

换句话说,获取元素在网页中的像素位置的方法非常简单,方法是使用element.getBoundingClientRect()

var rect = element.getBoundingClientRect();
console.log(rect.top, rect.right, rect.bottom, rect.left);
Run Code Online (Sandbox Code Playgroud)

因此,我们可以从控制台或通过网络应用程序以编程方式进行操作。

现在,假设我们随时都有一个Android浏览器(Chrome / Mozilla / WebView)。我可以URL在浏览器中检索网页的。在这种情况下:

https://login.microsoftonline.com/

所以我的问题是,给定登录页面的URL,我如何类似地获得对上相同输入字段的访问权限Android browser

在此处输入图片说明

我需要能够HTML在Android浏览器中访问网页的元素,并计算其像素位置。作为输入,我具有任何Android浏览器中的网页URL。

我说的是在Android运行时中通过Android应用执行此操作,即以编程方式使用Java / JS代码。

如果有人需要DOM页面的结构为文本,则可以使用以下(Java)代码以编程方式获取它:

URL url;
HttpURLConnection urlConnection;
String DOMContent = null;

try {
    url = new URL("https://login.microsoftonline.com/");
    urlConnection = (HttpURLConnection) url.openConnection();
    int responseCode = urlConnection.getResponseCode();
    if(responseCode == HttpURLConnection.HTTP_OK){
        DOMContent = readStream(urlConnection.getInputStream());
    }

} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

我需要HTML在Android运行时中访问移动网页的元素,就像在Web应用程序或桌面浏览器中的扩展程序中一样。换句话说,我需要能够从Android应用访问/操纵移动浏览器的DOM内容。

如何才能做到这一点?

更新

JavaScriptBridge看起来很有希望。DocumentBuilder可以帮助我们将DOM转换为Java对象,然后可以从Android本机进行访问/操作。

参考文献

1. 如何在Android上执行JavaScript?

2. 在WebView中调用JavaScript函数

3. 如何在Android的后台服务中运行Javascript代码

4. 有什么方法可以在Android的WebView中访问DOM结构?

5. Android Webview访问DOM

6. 在Android Webview中,我可以修改网页的DOM吗?

7. Android WebViews和JavaScript到Java的桥梁

8. 在Android中使用Javascript Bridge

9. WebView与本机之间通信的替代方法

Zun*_*Zun 1

页面加载后使用以下代码(实现自定义WebViewClient并检查onPageFinished

String query = "document.getElementById(\"WhateverElement\").getBoundingClientRect();"    

webView.evaluateJavascript(query, new ValueCallback<String>() {
        @Override
        public void onReceiveValue(String s) {
            Log.d("LogName", s); // s has the getBoundingClientRect
        }
    });
Run Code Online (Sandbox Code Playgroud)