ajax - sitio - porque algunas paginas no cargan en google chrome
¿Cómo saber cuándo se carga una página web al usar QtWebKit? (4)
Tanto QWebFrame
como QWebPage
tienen la QWebPage
void loadFinished(bool ok)
que se puede usar para detectar cuando una página web está completamente cargada. El problema es cuando una página web tiene contenido cargado asíncronamente (ajax). ¿Cómo saber cuándo la página está completamente cargada en este caso?
Cuando su inicial html / images / etc termine de cargarse, eso es todo. Está completamente cargado. Este hecho no cambia si luego decides usar algunos javascript para obtener datos adicionales, vistas de páginas o lo que sea después del hecho.
Dicho esto, lo que sospecho que quiere hacer aquí es exponer un objeto / interfaz QtScript a su vista que pueda invocar desde el script de su página, proporcionando efectivamente una "devolución de llamada" en su C ++ una vez que haya decidido (desde el script de la página) que has "cargado completamente".
Espero que esto te ayude a intentar ...
No he hecho esto, pero creo que puede lograr su solución usando QNetworkAccessManager
.
Puede obtener QNetworkAccessManager desde su QWebPage utilizando la función networkAccessManager () . QNetworkAccessManager tiene una señal finalizada (respuesta de QNetworkReply *) que se activa cada vez que la instancia de QWebPage solicita un archivo.
La señal finished
le proporciona una instancia de QNetworkReply, desde la cual puede obtener una copia de la solicitud original realizada, para identificar la solicitud.
Por lo tanto, cree una ranura para adjuntarla a la señal finished
, use los métodos de QNetworkReply pasados para averiguar qué archivo acaba de descargar y si es su solicitud de Ajax, haga el procesamiento que necesite.
Mi única advertencia es que nunca he hecho esto antes, así que no estoy 100% seguro de que funcione.
Otra alternativa podría ser utilizar los métodos de QWebFrame para insertar objetos en el modelo de objetos de la página y también insertar algo de JavaScript que luego notifique a su objeto cuando se complete la solicitud de Ajax. Esta es una forma un poco más hackier de hacerlo, pero definitivamente debería funcionar.
EDITAR:
La segunda opción me parece mejor. El flujo de trabajo es el siguiente:
Adjunte una ranura a la señal QWebFrame :: javascriptWindowObjectCleared (). En este punto, llame a QWebFrame :: evaluateJavascript () para agregar un código similar al siguiente: window.onload = function () {// la página está completamente cargada}
Pon el código que necesites en esa función. Es posible que desee agregar un QObject a la página a través de QWebFrame :: addToJavaScriptWindowObject () y luego invocar una función en ese objeto. Este código solo se ejecutará cuando la página esté completamente cargada.
¡Espero que esto responda la pregunta!
Para verificar la carga de un elemento específico, puede usar un QTimer
. Algo así en Python:
@pyqtSlot()
def on_webView_loadFinished(self):
self.tObject = QTimer()
self.tObject.setInterval(1000)
self.tObject.setSingleShot(True)
self.tObject.timeout.connect(self.on_tObject_timeout)
self.tObject.start()
@pyqtSlot()
def on_tObject_timeout(self):
dElement = self.webView.page().currentFrame().documentElement()
element = dElement.findFirst("css selector")
if element.isNull():
self.tObject.start()
else:
print "Page loaded"
El OP pensó que se debía a pedidos AJAX retrasados, pero también podría haber otra razón que también explique por qué un retraso muy corto soluciona el problema. Hay un error que causa el comportamiento descrito:
https://bugreports.qt-project.org/browse/QTBUG-37377
Para evitar este problema, la señal de carga finalizada () se debe conectar utilizando la conexión en cola.