Вы хотите изменить DOM, чтобы он уже был создан, в вашем случае вы используете runJavaScript до загрузки страницы, а DOM не создается. Учитывая, что есть 2 возможных решения:
- Используйте сигнал
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_())
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_())