Frage

Auf Android, ich habe eine WebView die eine Seite angezeigt wird.

Wie erhalte ich die Seite Quelle, ohne die Seite erneut startet?

Es scheint WebView sollte eine Art von getPageSource() Methode hat, dass die Renditen eine Zeichenfolge, aber leider nicht.

Wenn ich JavaScript aktivieren, was die entsprechende JavaScript in diesem Aufruf zu setzen, den Inhalt zu bekommen?

webview.loadUrl("javascript:(function() { " +  
    "document.getElementsByTagName('body')[0].style.color = 'red'; " +  
    "})()");  
War es hilfreich?

Lösung

Ich weiß, das ist eine späte Antwort, aber ich fand diese Frage, weil ich hatte das gleiche Problem. Ich denke, dass ich die Antwort gefunden in diesen Beitrag auf lexandera. com. Der folgende Code ist im Grunde eine Cut-and-Paste von der Website. Es scheint, den Trick zu tun.

final Context myApp = this;

/* An instance of this class will be registered as a JavaScript interface */
class MyJavaScriptInterface
{
    @JavascriptInterface
    @SuppressWarnings("unused")
    public void processHTML(String html)
    {
        // process the html as needed by the app
    }
}

final WebView browser = (WebView)findViewById(R.id.browser);
/* JavaScript must be enabled if you want it to work, obviously */
browser.getSettings().setJavaScriptEnabled(true);

/* Register a new JavaScript interface called HTMLOUT */
browser.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");

/* WebViewClient must be set BEFORE calling loadUrl! */
browser.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url)
    {
        /* This call inject JavaScript into the page which just finished loading. */
        browser.loadUrl("javascript:window.HTMLOUT.processHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
    }
});

/* load a web page */
browser.loadUrl("http://lexandera.com/files/jsexamples/gethtml.html");

Andere Tipps

Ausgabe 12987 , Blundell Antwort abstürzt (zumindest auf meinem 2.3 VM) . Stattdessen habe ich abfangen einen Anruf mit einem speziellen Präfix console.log:

// intercept calls to console.log
web.setWebChromeClient(new WebChromeClient() {
    public boolean onConsoleMessage(ConsoleMessage cmsg)
    {
        // check secret prefix
        if (cmsg.message().startsWith("MAGIC"))
        {
            String msg = cmsg.message().substring(5); // strip off prefix

            /* process HTML */

            return true;
        }

        return false;
    }
});

// inject the JavaScript on page load
web.setWebViewClient(new WebViewClient() {
    public void onPageFinished(WebView view, String address)
    {
        // have the page spill its guts, with a secret prefix
        view.loadUrl("javascript:console.log('MAGIC'+document.getElementsByTagName('html')[0].innerHTML);");
    }
});

web.loadUrl("http://www.google.com");

Dies ist eine Antwort basierend auf jluckyiv der , aber ich denke, es ist besser und einfacher Javascript wie folgt zu ändern.

browser.loadUrl("javascript:HTMLOUT.processHTML(document.documentElement.outerHTML);");

Haben Sie den HTML-Code separat betrachtet holen und sie dann in eine Webansicht Laden?

String fetchContent(WebView view, String url) throws IOException {
    HttpClient httpClient = new DefaultHttpClient();
    HttpGet get = new HttpGet(url);
    HttpResponse response = httpClient.execute(get);
    StatusLine statusLine = response.getStatusLine();
    int statusCode = statusLine.getStatusCode();
    HttpEntity entity = response.getEntity();
    String html = EntityUtils.toString(entity); // assume html for simplicity
    view.loadDataWithBaseURL(url, html, "text/html", "utf-8", url); // todo: get mime, charset from entity
    if (statusCode != 200) {
        // handle fail
    }
    return html;
}

konnte ich dies zum Laufen bringen mit dem Code von @ jluckyiv Antwort, aber ich hatte in @JavascriptInterface Anmerkung zur processHTML Methode in der MyJavaScriptInterface hinzuzufügen.

class MyJavaScriptInterface
{
    @SuppressWarnings("unused")
    @JavascriptInterface
    public void processHTML(String html)
    {
        // process the html as needed by the app
    }
}

Sie müssen auch die Methode mit @JavascriptInterface zu annotieren, wenn Ihre targetSdkVersion ist> = 17 - weil es neu ist die Sicherheitsanforderungen in SDK 17, das heißt alle JavaScript-Methoden müssen mit @JavascriptInterface kommentiert werden. Ansonsten sehen Sie Fehler wie: Uncaught Typeerror: Object [object Object] hat keine Methode 'processHTML' auf null: 1

Wenn Sie auf kitkat und oben arbeiten, können Sie die Chrom verwenden Remote-Tools debuggen alle Anfragen und Antworten zu finden, die in und aus Ihrem Webansicht und auch die der HTML-Quellcode der Seite betrachtet wird.

https://developer.chrome.com/devtools/docs/remote-debugging

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top