【问题标题】:Filling out a form using PyQt and QWebview使用 PyQt 和 QWebview 填写表格
【发布时间】:2012-06-16 03:02:07
【问题描述】:

我想使用 PyQt/QWebview 1)加载特定的 url,2)在表单中输入信息,3)单击按钮/链接。 Mechanize 不起作用,因为我需要一个实际的浏览器。

这是我的代码:

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@email.com")
    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_())

页面加载正确,但没有输入任何输入,也没有提交表单。有什么想法吗?

【问题讨论】:

    标签: python pyqt screen-scraping qtwebkit qwebview


    【解决方案1】:

    这帮助我使它工作:

    user.setAttribute("value", "email@email.com")
    -->
    user.evaluateJavaScript("this.value = 'email@email.com'")
    

    属性和属性是不同的东西。

    另一个修复:

    click() --> this.click()
    

    【讨论】:

      【解决方案2】:

      对于希望使用 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@email.com'")
              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
      

      【讨论】:

      • +1 为你回答,但它并没有一路走下去。 loadFinished() 信号在初始加载时发出两次,在 click() 后发出一次,请参阅我对 stackoverflow.com/questions/53429181/… 的回答以获得完整的实现。
      【解决方案3】:

      您也许可以使用 Webkit/QWebView 来做到这一点,但是使用 selenium:http://code.google.com/p/selenium/ 呢?它就是为这种浏览器自动化而设计的,并且有很好的 python 绑定。

      【讨论】:

        猜你喜欢
        • 2012-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-11
        • 1970-01-01
        • 2014-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多