PyQt5 QUrl is empty after QUrl.setUrl

426 views Asked by At

I habe a problem with my python script. I want to make an simple app that log in a person on a website automatically. This can be done with a QUrl and a QUrlQuery i think. It´s just that that a form in html does. OK now to my problem: When I try to print the QUrl with print(login_url.toString(QUrl())) , it just prints an empty line.

IServ.py

# -*- coding: utf-8 -*-
from PyQt5.QtCore import QUrl, QUrlQuery
from PyQt5.QtWidgets import QMessageBox
from PyQt5 import QtWidgets

import os
import Webview
import sys


def handle_url_changed():
    if webView.url() == QUrl("https://the-server.de/iserv/login"):
        login_url = QUrl
        login_url.setUrl(QUrl(), "https://the-server.de/iserv/login_check")
        # os.system("notify-send " + login_url.toString(QUrl()))

        login_query = QUrlQuery
        login_query.addQueryItem(QUrlQuery(), "Class", "login-form")
        login_query.addQueryItem(QUrlQuery(), "Method", "post")
        login_query.addQueryItem(QUrlQuery(), "_username", "...")
        login_query.addQueryItem(QUrlQuery(), "_password", "...")
        login_query.addQueryItem(QUrlQuery(), "_remember_me", "0")

        login_url.setQuery(QUrl(), login_query())
        webView.load(login_url())
        print(login_url.toString(QUrl()))


app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Webview.Ui_MainWindow()
ui.setupUi(MainWindow)
webView = ui.webView
webView.urlChanged.connect(lambda: handle_url_changed())
MainWindow.show()
sys.exit(app.exec_())

Webview.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'Webview.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import QtWebEngineWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(900, 700)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setMinimumSize(QtCore.QSize(500, 625))
        MainWindow.setFocusPolicy(QtCore.Qt.NoFocus)
        MainWindow.setUnifiedTitleAndToolBarOnMac(True)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.webView = QtWebEngineWidgets.QWebEngineView(self.centralwidget)
        self.webView.setUrl(QtCore.QUrl("https://the-server.de/"))
        self.webView.setObjectName("webView")
        self.gridLayout.addWidget(self.webView, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "IServ"))


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

1

There are 1 answers

1
eyllanesc On BEST ANSWER

The main mistake is that you are not creating QUrl and QUrlQuery objects (or rather you are creating and deleting them instantly).

Also, it is better to create a class than to handle global variables to avoid having silent errors.

So I recommend you review your OOP notes.

Considering the above, the solution is:

# -*- coding: utf-8 -*-
import os
import sys

from PyQt5.QtCore import QUrl, QUrlQuery
from PyQt5.QtWidgets import QMessageBox
from PyQt5 import QtWidgets


import Webview


class MainWindow(QtWidgets.QMainWindow, Webview.Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.webView.urlChanged.connect(self.handle_url_changed)

    def handle_url_changed(self, url):
        if url == QUrl("https://the-server.de/iserv/login"):
            login_url = QUrl("https://the-server.de/iserv/login_check")
            login_query = QUrlQuery()
            login_query.addQueryItem("Class", "login-form")
            login_query.addQueryItem("Method", "post")
            login_query.addQueryItem("_username", "...")
            login_query.addQueryItem("_password", "...")
            login_query.addQueryItem("_remember_me", "0")
            login_url.setQuery(login_query)
            self.webview.load(login_url)
            print(login_url.toString())


def main():
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()