2017-07-21 2 views
0

Ce que je suis en fin de compte essaie d'accomplir est de saisir le nom d'utilisateur et mot de passe que l'utilisateur entre dans un site Web. Par exemple, si l'utilisateur saisit "[email protected]" comme adresse e-mail dans la connexion de Facebook, puis clique sur "Envoyer", je souhaite stocker cette adresse e-mail dans mon application PyQt.QWebEngineView - Javascript Callback

Le plus proche que je suis venu à la réalisation de ce qui a utilisé une série de commandes JavaScript pour placer un écouteur sur le bouton « Connexion » qui retourne la valeur actuelle du paramètre utilisateur. Mon problème est que le rappel que PyQt fournit est pour lorsque la fonction runJavaScript est terminée, pas l'écouteur d'événement javascript. Je me demande s'il existe un moyen de capturer la fonction de rappel de la fonction JavaScript, ou s'il y a une meilleure façon de procéder.

import os 
import sys 
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget 
from PyQt5.QtCore import QUrl, QEventLoop 
from PyQt5.QtWebEngineWidgets import QWebEngineView 

class WebPage(QWebEngineView): 
    def __init__(self): 
     QWebEngineView.__init__(self) 
     self.load(QUrl("https://facebook.com")) 
     self.loadFinished.connect(self._on_load_finished) 
     #self.page().runJavaScript("document.getElementById("myBtn").addEventListener("click", displayDate)", print) 

    def _on_load_finished(self): 
     print("Finished Loading") 
     cmds = ["btn=document.getElementById('u_0_r')", # Login Button 
       "user=document.getElementsByName('email')[0]", 
       "function get_username(){return user.value}", 
       "btn.addEventListener('click', get_username)"] 
     self.page().runJavaScript("; ".join(cmds), lambda x: print("test: %s" % x)) 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    web = WebPage() 
    web.show() 
    sys.exit(app.exec_()) # only need one app, one running event loop 
+0

Vous essayez de capturer le nom d'utilisateur *** et *** mot de passe? ? – ekhumoro

+0

Oui, l'exemple montre que le nom d'utilisateur/email car (corrigez-moi si je me trompe) les principes devraient être les mêmes – aoh

+0

Mais vous semblez essayer de voler les mots de passe des utilisateurs ... – ekhumoro

Répondre

1

J'ai trouvé un travail autour de l'utilisation du signal « urlChanged » qui semble fonctionner à ce jour pour mes applications

import os 
import sys 
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget 
from PyQt5.QtCore import QUrl, QEventLoop 
from PyQt5.QtWebEngineWidgets import QWebEngineView 
from PyQt5.QtWebEngineCore import QWebEngineUrlRequestInterceptor 

class WebPage(QWebEngineView): 
    def __init__(self): 
     QWebEngineView.__init__(self) 
     self.current_url = '' 
     self.load(QUrl("https://facebook.com")) 
     self.loadFinished.connect(self._on_load_finished) 
     self.urlChanged.connect(self._on_url_change) 

    def _on_load_finished(self): 
     self.current_url = self.url().toString() 

    def _on_url_change(self): 
     self.page().runJavaScript("document.getElementsByName('email')[0].value", self.store_value) 

    def store_value(self, param): 
     self.value = param 
     print("Param: " +str(param)) 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    web = WebPage() 
    web.show() 
    sys.exit(app.exec_()) # only need one app, one running event loop