Проблемы с 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 шт):

Автор решения: S. Nick

Я не знаю с чего вы решили, что:

... что проблема заключается в том, что тег 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())

введите сюда описание изображения

→ Ссылка