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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top