Проблемы с callback в `QWebEnginePage().runJavaScript(js_code, callback)`
В настоящее время я изучаю PyQt6 и мне интересно узнать больше о возможностях QtWebEngine.
Буду признателен, если вы порекомендуете какие-нибудь руководства или учебные пособия по изучению QtWebEngine.
Заранее спасибо за вашу помощь.
Я понимаю, что проблема заключается в том, что тег img не появляется на веб-странице вовремя, чтобы метод JavaScript findElementByClassName мог его найти.
main.py:
import sys
from PyQt6.QtWidgets import QApplication
from PyQt6.QtWebEngineWidgets import QWebEngineView
from PyQt6.QtCore import QUrl
def js_handle_callback(result):
print('Result: ', type(result), result)
js_code = """
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
var img = document.getElementsByClassName('lnXdpd');
canvas.height = img.naturalHeight;
canvas.width = img.naturalWidth;
context.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight);
var base64String = canvas.toDataURL();
base64String;
"""
def js_run():
page.runJavaScript(js_code, js_handle_callback)
if __name__ == '__main__':
app = QApplication(sys.argv)
view = QWebEngineView()
page = view.page()
page.loadFinished.connect(js_run)
view.load(QUrl('https://google.com'))
view.show()
sys.exit(app.exec())
Output:
Result: <class 'NoneType'> None
Пробовал использовать сигнал loadFinished, но не помогает.
JavaScript window.addEventListener('load', function(){ My Code }) также не помогает, поскольку callback не ожидает события 'load'.
Ответы (1 шт):
Я не знаю с чего вы решили, что:
... что проблема заключается в том, что тег
imgне появляется на веб-странице вовремя, чтобы методJavaScript findElementByClassNameмог его найти.
Я не знаю, что должен делать js_code = """ ... """
А вот сигнал loadFinished - работает как надо, проверьте.
import sys
'''
from PyQt6.QtWidgets import QApplication # PyQt6
from PyQt6.QtWebEngineWidgets import QWebEngineView
from PyQt6.QtCore import QUrl
'''
from PyQt5.QtWidgets import QApplication # PyQt5
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QUrl, pyqtSlot # + pyqtSlot
def js_handle_callback(result): # не использовал
print(f'\n Result: {type(result)}; {result}\n') # не использовал
# не использовал
# Sorry, я не не знаю что тут и 'canvas' - это что такое ??? <------- ???
js_code = """ vvvvvv <------------- это что такое ???
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
var img = document.getElementsByClassName('lnXdpd');
canvas.height = img.naturalHeight;
canvas.width = img.naturalWidth;
context.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight);
var base64String = canvas.toDataURL();
base64String;
"""
def callback_function(html): # +++
print('-= callback_function(html): START =-' * 2)
print(f'\n{html[:300]}\n\n ... \n\n{html[-300:]}\n')
print('-= callback_function(html): END =-' * 3)
@pyqtSlot(bool) # +++
def js_run(finished):
print(f'\ndef js_run(): 111 {finished} <<===== \n load finished {finished} <<=====') #
page = view.page() # +++
print(f'def js_run(): 222 {page} \n\t{view.url()}') #
# page.runJavaScript(js_code, js_handle_callback) # ??? js_code
page.runJavaScript( # +++
"document.getElementsByTagName('html')[0].innerHTML", # +++
callback_function # +++
) # +++
print(f'def js_run(): 333 inject js ok\n') #
def onLoadStarted():
print('\nload started: ожидание завершения загрузки страницы)')
if __name__ == '__main__':
app = QApplication(sys.argv)
view = QWebEngineView()
# page = view.page()
view.loadStarted.connect(onLoadStarted) # +++
view.loadFinished.connect(js_run) # +++
# page.loadFinished.connect(js_run)
view.load(QUrl('https://google.com'))
print(f'\n111 {view}\n') #
view.show()
sys.exit(app.exec())
