2012-06-16 40 views
6

Chciałbym użyć PyQt/QWebview do 1) załadowania określonego adresu URL, 2) wprowadzenia informacji do formularza, 3) kliknięcia przycisków/linków. Mechanize nie działa, ponieważ potrzebuję rzeczywistej przeglądarki.Wypełnianie formularza za pomocą PyQt i QWebview

Oto mój kod:

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_()) 

strona ładuje się poprawnie, ale nie ma wejścia i forma nie jest składany. Jakieś pomysły?

Odpowiedz

0

Możesz być w stanie to zrobić za pomocą pakietu Webkit/QWebView, ale co z selenem: http://code.google.com/p/selenium/? Jest przeznaczony do tego rodzaju automatyzacji przeglądarki i ma ładne wiązania Pythona.

6

To pomogło mi, aby to działało:

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

Atrybut i własność są różne rzeczy.

Jeszcze jeden dylemat:

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

działa funkcja setAttribute – Like

0

Dla każdego, kto chce zrobić z PyQt5, ten przykład może pomóc jak wiele rzeczy się zmieniło. Oczywiście javascript musi być dostosowany w oparciu o zawartość strony.

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