Accediendo a DOM Webkit Objective C
-
03-07-2019 - |
Pregunta
¿Podría alguien que esté familiarizado con el webkit? Por favor, explícame o apúntame en la dirección correcta de por qué el siguiente código no funciona
Lo que estoy tratando de hacer es cargar una página, hacer que el webkit la analice y simplemente imprimir el título.
Esto es lo que tengo:
#include <iostream>
#include <WebKit/WebKit.h>
using namespace std;
/*
Seek Help
*/
int main (int argc, char * const argv[]) {
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
WebFrame * mainFrame;
WebView * view = [[WebView alloc] initWithFrame: NSMakeRect (0,0,640,480)];
mainFrame = [view mainFrame];
NSString * url = @"http://test.com";
[[view mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
NSString * data = @"<html><head><title>testing</title></head><body>tester</body></html>";
[[view mainFrame] loadHTMLString:data baseURL: nil];
// NSString * urlString = [[NSString alloc] initWithUTF8String:"<html><head><title>Hello World</title></head><body><p>My first Web page.</p></body></html>"];
//[[view mainFrame] loadHTMLString:urlString baseURL:nil];
NSString * outerHtml = [(DOMHTMLElement *)[[[view mainFrame] DOMDocument] documentElement] innerHTML];
cout << "Html: " << [outerHtml UTF8String] << endl;
NSString * title = [view mainFrameTitle];
cout << "title: " << [title UTF8String] << endl;
[autoreleasepool release];
return 0;
}
La salida es tanto html como el título están en blanco
Gracias por leer
Solución
No funciona porque WebKit confía en RunLoop para cargar contenido, incluso si solo es contenido estático.
Debes agregar un bucle de ejecución estándar como:
while (!done) {
pool = [[NSAutoreleasePool alloc] init];
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate distantPast]];
[pool release];
}
Y cree una clase personalizada que establezca como WebFrameLoadDelegate ( webView.frameLoadDelegate = thatObject
) y en el - (void) webView: (WebView *) el remitente didFinishLoadForFrame: (WebFrame * ) devolución de llamada de marco
debe poder acceder al DOM. También cuando la carga haya terminado, establezca la marca done
en YES.
Otros consejos
Si solo desea analizar el HTML, ¿por qué no utilizar un documento NSXMLDocument en lugar de un WebView? Creo que su initWithContentsOfURL initializer se bloquea hasta que se carga la url. Y si eso no funciona, intente crear una NSURLRequest para la URL y luego use [NSURLConnection sendSynchronousRequest: ..] para cargarla y luego aliméntela a NSXMLDocument.