Qt - Проблема QWebView - PullRequest
       5

Qt - Проблема QWebView

0 голосов
/ 24 декабря 2010

У меня есть скрипт PyQt GUI, который состоит из виджета QWebView. Я пытаюсь отправить запрос GET, т. Е. Перейти на страницу, заполнить форму и нажать кнопку, используя код внизу этого вопроса.

Поскольку я имею дело с documentElement (QWebElement) веб-просмотра, мне нужно поместить все действия DOM в отдельную функцию (которую я назвал fillForm) и подключить сигнал loadFinished () к функции. Без подключения сигнала документ не будет загружен, и я не смогу получить нужные элементы.

Я могу правильно отправить форму и получить правильный ответ с веб-страницы.

Проблема, с которой я столкнулся, заключается в том, что вышеприведенное приводит к некоторому бесконечному циклу Это связано с тем, что веб-страница перезагружается при каждой загрузке новой страницы, поэтому форма заполняется каждый раз без остановки.

Я хотел бы знать, есть ли какой-нибудь способ узнать, загружена ли страница WebView полностью, не асинхронно или, возможно, приостановить выполнение скрипта (без остановки графического интерфейса пользователя), пока весь документ не загрузится. Я не могу найти удовлетворительное решение (моя идея состояла в том, чтобы сохранить глобальную переменную для отслеживания кликов) этой проблемы. Я был бы признателен, если бы кто-нибудь мог помочь мне с лучшим способом справиться с этим. Спасибо!

Вот код, который я использую

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
from PyQt4 import QtCore

app = QApplication(sys.argv)
web = QWebView()
web.load(QUrl("http://mywebsite.com"))

def fillForm():
    doc = web.page().mainFrame().documentElement()
    searchform = doc.findFirst("input[type=text]")
    searchform.setAttribute("value", "hello")
    button = doc.findFirst("input[type=submit]")
    button.evaluateJavaScript("click()")

QtCore.QObject.connect(web, QtCore.SIGNAL("loadFinished"), fillForm)
web.show()
sys.exit(app.exec_())

1 Ответ

2 голосов
/ 26 декабря 2010

та же проблема для создания "веб-робота"

Я нашел это решение, используя attesaLoop.exec(); для приостановки всех и webView_loadFinished для возобновления выполнения, когда страница загрузила файл

в заголовочном файле объявите

#include <QEventLoop>
QEventLoop attesaLoop;

в коде функции

void MainWindow::naviga()
{
  //--webView--webPage--webFrame--//--QWebElement--//
  indirizzo = "http://www.google.it";
  ui->webView->load(QUrl(indirizzo));

  attesaLoop.exec();

  ui->listWidget->addItem("fine caricamento");
  frame = ui->webView->page()->mainFrame();
  documento = frame->documentElement();
  formInput = documento.findFirst("input[name=q]");
  formInput.setAttribute("value","hallo");
  bottone = documento.findFirst("input[type=submit]");
  bottone.evaluateJavaScript("this.click()");

  attesaLoop.exec();
}

void MainWindow::on_webView_loadFinished(bool)
{
  //ui->listWidget->addItem(indirizzo);
  attesaLoop.exit();
  //esegui e;
  //e.cerca(documento);
}
...