2012-06-16 56 views
6

我想用PyQt/QWebview來加載一個特定的URL,2)在表單中輸入信息,3)點擊按鈕/鏈接。機械化不起作用,因爲我需要一個實際的瀏覽器。使用PyQt和QWebview填寫表格

這裏是我的代碼:

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

該頁面加載正確,但沒有輸入輸入和形式尚未提交。有任何想法嗎?

回答

0

您可以使用Webkit/QWebView來做到這一點,但是如何使用硒:http://code.google.com/p/selenium/?它專門爲這種瀏覽器自動化而設計,並有很好的python綁定。

6

幫我使其工作:

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

屬性和屬性是不同的東西。

還有一個修復:

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

setAttribute works – Like

0

對於任何尋求與PyQt5要做到這一點,這個例子可以幫助幾個事情發生了變化。很顯然,JavaScript需要根據網站的內容進行調整。

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