[Python] pywebkit

~redShadow~ redshadow a hackzine.org
Gio 16 Gen 2014 11:32:15 CET


On 01/15/2014 06:03 PM, mauro wrote:
> Un caloroso salve a tutti.
> 
> Vorrei chiedere aiuto e forse anche conforto spiriturale circa un problemino su cui mi sto dissanguando da un po' di giorni.
> 
> ho la necessita' di usare webkit per interagire con un server web dove c'e' piu' javascript che anima. In giro non mi pare di aver visto  prodotti che possano tirar su una pagina html infarcita di javascript e gestirsela meglio di webkit.
> 
> il codice, grosso modo deve caricarsi la pagina che gli indico (portandosi appresso, per l'appunto tutto il codice javascript), lanciare una semplice chiamata e ritornarmi un valore da usare nel resto dell'applicazione python.
> 
> A parte che non si trova documentazione fatta bene per pywebkit manco ammazzato. Ho usato tutti i vari esempi trovati in rete, riferimenti sul sito webkit ufficiale e ricerche a 360 gradi.
> 
> questo il codice:
> 
> 
> import webkit
> 
> w = webkit.WebView()
> w.load_uri('http://192.168.9.1')
> w.execute_script('document.title = STR_AJAX_VALUE')
> print w.get_main_frame().get_title()

> il problema non e' il come fare.... perche' questo script, eseguito in una shell, 
> digitato a manina, riga per riga all'interno dell'interprete python
> funziona perfettamente e non sbaglia un colpo.

Penso derivi dal fatto che load_uri() non aspetta che la pagina sia
caricata / dom inizializzato / tutti gli script eseguiti, mentre quando
inserisci i comandi nell'interprete fai una pausa che da' il tempo
necessario al caricamento.

Giusto per fare una prova, questo dovrebbe funzionare:

import time
import webkit

w = webkit.WebView()
w.load_uri('http://192.168.9.1')
time.sleep(3)
w.execute_script('document.title = STR_AJAX_VALUE')
print w.get_main_frame().get_title()


Ovviamente non é il metodo piú pulito per fare questa cosa, ma quello
sleep di 3 secondi dovrebbe dare tempo agli script della pagina di
terminare l'esecuzione; un metodo piú pulito puó essere quello di
wrappare il codice javascript in un handler dell'evento "load", in modo
da garantire l'esecuzione *dopo* al resto del javascript della pagina,
anche se, anche in quel caso, la chiamata é asincrona, quindi devi
comunque trovare un modo di "bloccare" fino all'esecuzione del tuo
script (penso / spero che esista qualche modo di catturare eventi
javascript attraverso l'oggetto WebView, comunque..).



-- 
  Samuele ~redShadow~ Santi

----------------------------------------------------------------------


                  ----(  Contact information  )----

                   E-MAIL:  redshadow a hackzine.org
                     BLOG:  http://www.hackzine.org
                     WIKI:  http://wiki.hackzine.org
                  TWITTER:  https://twitter.com/_rshk
                   GITHUB:  https://github.com/rshk


                  ----(  GPG Key: 09F09951  )----

          1AFC FAE5 CA4B 3FB0 F300 FA64 3CB0 1008 09F0 9951


             ----(  Registered Linux-User: #440008  )----

	      DEBIAN User since 2004 (I even used Sid!)
		     GENTOO User since 2008-01-01


----------------------------------------------------------------------

  Think about the environment: for each top-posted, badly quoted
  or bulk e-mail I receive, I'm going to cut down a tree.

-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        signature.asc
Tipo:        application/pgp-signature
Dimensione:  555 bytes
Descrizione: OpenPGP digital signature
URL:         <http://lists.python.it/pipermail/python/attachments/20140116/a9a0ef0e/attachment.pgp>


Maggiori informazioni sulla lista Python