2012-06-16 28 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