2012-06-16 28 views
6

Me gustaría usar PyQt/QWebview para 1) cargar una URL específica, 2) ingresar información en un formulario, 3) hacer clic en botones/enlaces. Mecanizar no funciona porque necesito un navegador real.Rellenar un formulario usando PyQt y QWebview

Aquí está mi código:

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import * 
from PyQt4 import QtCore 

app = QApplication(sys.argv) 
web = QWebView() 
web.load(QUrl("https://www.lendingclub.com/account/gotoLogin.action")) 

def fillForm(): 
    doc = web.page().mainFrame().documentElement() 
    user = doc.findFirst("input[id=master_username]") 
    passwd = doc.findFirst("input[id=master_password]") 

    user.setAttribute("value", "[email protected]") 
    passwd.setAttribute("value", "password") 


    button = doc.findFirst("input[id=master_sign-in-submit]") 
    button.evaluateJavaScript("click()") 

QtCore.QObject.connect(web, QtCore.SIGNAL("loadFinished"), fillForm) 
web.show() 
sys.exit(app.exec_()) 

Las cargas de la página correctamente, pero no se introduce ningún entrada y el formulario no se presenta. ¿Algunas ideas?

Respuesta

0

Es posible que pueda hacerlo con Webkit/QWebView, pero ¿qué pasa con el uso de selenio: http://code.google.com/p/selenium/? Está diseñado exactamente para este tipo de automatización de navegador y tiene buenas conexiones de pitón.

6

Esto me ayudó a hacer que funcione:

user.setAttribute("value", "[email protected]") 
--> 
user.evaluateJavaScript("this.value = '[email protected]'") 

Atributo y la propiedad son cosas diferentes.

Una solución más:

click() --> this.click() 
+0

setEjecutar obras – Like

0

para cualquiera que quiera hacer esto con PyQt5, este ejemplo puede ayudar a que varias cosas han cambiado. Obviamente, el javascript debe ajustarse en función de los contenidos del sitio web.

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://www.url.com")) 
     self.loadFinished.connect(self._on_load_finished) 

    def _on_load_finished(self): 
     print("Finished Loading") 
     self.page().toHtml(self.Callable) 

    def Callable(self, html_str): 
     self.html = html_str 
     self.page().runJavaScript("document.getElementsByName('loginid')[0].value = '[email protected]'") 
     self.page().runJavaScript("document.getElementsByName('password')[0].value = 'test'") 
     self.page().runJavaScript ("document.getElementById('signin').click()") 

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