pythonpyqt5qurl

PyQt5 QUrl is empty after QUrl.setUrl


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


Solution

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