¿Cómo obtengo el contenido de la página web desde un WebView?
En Android, tengo un WebView
que muestra una página.
¿Cómo obtengo la fuente de la página sin volver a solicitarla?
Parece que WebView
debería tener algún tipo de getPageSource()
método que devuelva una cadena, pero lamentablemente no es así.
Si habilito JavaScript, ¿cuál es el JavaScript apropiado para incluir en esta llamada para obtener el contenido?
webview.loadUrl("javascript:(function() { " +
"document.getElementsByTagName('body')[0].style.color = 'red'; " +
"})()");
Creo que encontré la respuesta en esta publicación en lexandera.com. El siguiente código es básicamente un cortar y pegar del sitio. Parece funcionar.
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");
Según el número 12987 , la respuesta de Blundell falla (al menos en mi VM 2.3). En lugar de eso, intercepto una llamada a console.log con un prefijo especial:
// 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");
Esta es una respuesta basada en jluckyiv , pero creo que es mejor y más sencillo cambiar Javascript de la siguiente manera.
browser.loadUrl("javascript:HTMLOUT.processHTML(document.documentElement.outerHTML);");