У меня есть рабочий сценарий, использующий PyQt-5.5.1, и теперь я хочу перенести его на новую версию PyQt (5.7). Адаптация большинства вещей прошла нормально, но я столкнулся с двумя серьезными проблемами: (1) выполнить (смоделированный) щелчок мышью, (2) получить доступ (скажем: печать) к исходному коду html веб-страницы, которая в настоящее время отображается в QWebView или QWebEngineView соответственно.
Например, я мог бы сделать следующее, используя QWebView в PyQt-5.5.1:
QTest.mouseClick(self.wvTest, Qt.LeftButton, QPoint(x, y))
а также
frame = self.wvTest.page().mainFrame()
print(frame.toHtml().encode('utf-8'))
Мне известны документы, а также эта страница о переносе на QWebEngineView, но неспособности преобразовать нотацию C ++ в рабочий код Python.
Как я могу адаптировать это к QWebEngineView в PyQt-5.7? Ниже приведен полностью рабочий фрагмент для PyQt-5.5.1, который не работает для новой версии PyQt:
- для Button1: никакой реакции на щелчок мышью.
- для Button2:
AttributeError: 'QWebEnginePage' object has no attribute 'mainFrame'
, и когда я удаляю мэйнфрейм ():TypeError: toHtml(self, Callable[..., None]): not enough arguments
.
import sys from PyQt5.QtWidgets import QWidget, QPushButton, QApplication from PyQt5.QtCore import QRect, Qt, QUrl, QPoint, QEvent from PyQt5.QtTest import QTest from PyQt5.Qt import PYQT_VERSION_STRесли PYQT_VERSION_STR == '5.5.1': из PyQt5 импортировать QtWebKitWidgets иначе: из PyQt5 импортировать QtWebEngineWidgets
class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.button1 = QPushButton('Button1', self) self.button1.clicked.connect(self.buttonOne) self.button1.setGeometry(QRect(10, 10, 90, 20)) self.button2 = QPushButton('Button2', self) self.button2.clicked.connect(self.buttonTwo) self.button2.setGeometry(QRect(110, 10, 90, 20)) if PYQT_VERSION_STR=='5.5.1': self.wvTest = QtWebKitWidgets.QWebView(self) else: self.wvTest = QtWebEngineWidgets.QWebEngineView(self) self.wvTest.setGeometry(QRect(10, 40, 430, 550)) self.wvTest.setUrl(QUrl('http://www.startpage.com')) self.wvTest.setObjectName('wvTest') self.setGeometry(300, 300, 450, 600) self.setWindowTitle('WebView minimalistic') self.show() def buttonOne(self): qp = QPoint(38, 314) QTest.mouseClick(self.wvTest, Qt.LeftButton, pos=qp) # or: QTest.mouseMove(self.wvTest, pos=self.qp) print('Button1 pressed.') def buttonTwo(self): frame = self.wvTest.page().mainFrame() print(frame.toHtml().encode('utf-8')) if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())