我有一个使用PyQt-5.5.1的工作脚本,我现在想要移植到新的PyQt版本(5.7) . 适应大多数事情很好,但我遇到了两个主要问题:(1)执行(模拟)鼠标点击,(2)访问(比如说:打印)当前显示的网页的html源代码分别是QWebView或QWebEngineView .
例如,我可以使用PyQt-5.5.1中的QWebView执行以下操作:
QTest.mouseClick(self.wvTest, Qt.LeftButton, QPoint(x, y))
和
frame = self.wvTest.page().mainFrame()
print(frame.toHtml().encode('utf-8'))
我知道docs以及this page关于移植到QWebEngineView但无法将C符号转换为有效的Python代码 .
如何在PyQt-5.7中将其改编为QWebEngineView?下面是PyQt-5.5.1的一个完整工作片段,它对于新的PyQt版本失败了:
对于Button1
- :根本没有鼠标点击反应 .
009 for 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
if PYQT_VERSION_STR=='5.5.1': from PyQt5 import QtWebKitWidgets
else: from PyQt5 import 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_())
1 回答
QWebEngineView
类不是QWebView
的替代品 . 正如porting guide明确指出的那样,许多API已经从根本上改变了,并且一些主要功能完全缺失 . 除非您的浏览器实现非常非常简单,否则这可能会导致无法编写兼容层 . 编写单独的测试套件很可能更容易(除非你不介意编写大量的条件代码) .首先,您需要为QTBUG-43602实施解决方案 .
QWebEngineView
的当前设计意味着内部QOpenGLWidget
处理鼠标事件,因此每当加载页面时,您的代码都需要获得对它的新引用:要访问页面的html,您需要一些条件代码,因为Web引擎API异步工作,需要回调 . 此外,没有用于处理Web引擎中的帧的内置API(您需要使用javascript),因此所有内容都需要通过网页: