我本来想解决this problem,但是当我测试QWebEnginePage::runJavaScript()的行为时,我发现我什至无法使用QWebEnginePage :: runJavaScript()和以下代码来更改backgroundImage,所以为什么?
import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtWebEngineCore import *
class WebEngineView(QWebEngineView):
def __init__(self, parent=None):
super().__init__(parent)
self.webPage = self.page()
# self.webPage = WebEnginePage()
self.webPage.load(QUrl('https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style'))
self.webPage.runJavaScript('''
window.addEventListener("load", function(event) {
alert(document.title);
document.body.style.backgroundImage = "url('https://www.w3schools.com/jsref/img_tree.png')";
});
''') # QWebEngineScript.MainWorld
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setAttribute(Qt.AA_UseSoftwareOpenGL)
webEngineView = WebEngineView()
webEngineView.show()
sys.exit(app.exec_())
答案 0 :(得分:2)
您想要修改DOM,以便必须已经创建它,在这种情况下,您需要在加载页面和未构建DOM之前使用runJavaScript。考虑到有两种可能的解决方案:
loadFinished
信号执行脚本:import sys
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets
class WebEngineView(QtWebEngineWidgets.QWebEngineView):
def __init__(self, parent=None):
super().__init__(parent)
self.loadFinished.connect(self.on_load_finished)
self.load(
QtCore.QUrl(
"https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style"
)
)
@QtCore.pyqtSlot(bool)
def on_load_finished(self, ok):
if ok:
script = """
alert(document.title);
document.body.style.backgroundImage = "url('https://www.w3schools.com/jsref/img_tree.png')";
"""
self.page().runJavaScript(script)
if __name__ == "__main__":
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_UseSoftwareOpenGL)
app = QtWidgets.QApplication(sys.argv)
w = WebEngineView()
w.show()
sys.exit(app.exec_())
QWebEngineScript
来实现允许您注入JavaScript代码的user script
:import sys
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets
class WebEngineView(QtWebEngineWidgets.QWebEngineView):
def __init__(self, parent=None):
super().__init__(parent)
script = QtWebEngineWidgets.QWebEngineScript()
name = "test"
source = """
alert(document.title);
document.body.style.backgroundImage = "url('https://www.w3schools.com/jsref/img_tree.png')";
"""
script.setName(name)
script.setSourceCode(source)
script.setInjectionPoint(
QtWebEngineWidgets.QWebEngineScript.DocumentReady
)
script.setRunsOnSubFrames(True)
script.setWorldId(QtWebEngineWidgets.QWebEngineScript.ApplicationWorld)
self.page().scripts().insert(script)
self.load(
QtCore.QUrl(
"https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style"
)
)
if __name__ == "__main__":
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_UseSoftwareOpenGL)
app = QtWidgets.QApplication(sys.argv)
w = WebEngineView()
w.show()
sys.exit(app.exec_())