Filling out a form using PyQt and QWebview

I would like to use PyQt / QWebview for 1) upload a specific URL, 2) enter information on the form, 3) click buttons / links. Mechanization does not work because I need an actual browser.

Here is my code:

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

The page loads correctly, but the input is not entered and the form is not submitted. Any ideas?

+6
source share
3 answers

This helped me do this:

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

Attribute and property are two different things.

Another fix:

 click() --> this.click() 
+6
source

You may be able to do this using Webkit / QWebView, but what about using selenium: http://code.google.com/p/selenium/ ? It is designed for this kind of browser automation and has good python bindings.

0
source

For those who want to do this with PyQt5, this example may help, as several things have changed. Obviously, javascript needs to be adjusted based on the contents of the website.

 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 
0
source

Source: https://habr.com/ru/post/918227/


All Articles