pythonpython-3.xpyqtpyqt5qtwebengine

Python PyQT5 WebEngine Segmentation fault Error


I wanted to create an app to download ms store app, it ran fine untill today now when i try to open the site (https://apps.microsoft.com/) pyqt5 window crashes and it shows 'Segmentation fault', when i try to load pages like microsoft.com or google.com it works fine it crashes when i search for an app in microsoft.com and the page returns a url which starts with 'https://apps.microsoft.com/...' it crashes with the 'Segmentation fault' error

# importing required libraries
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtPrintSupport import *
import os
import sys

# creating main window class
class MainWindow(QMainWindow):

    # constructor
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)


        # creating a QWebEngineView
        self.browser = QWebEngineView()

        self.browser.setUrl(QUrl("https://apps.microsoft.com/")) #if you change this to something like google.com or microsoft.com it works fine but when you try to access a site that starts with something like this you get error 

        # adding action when url get changed
        self.browser.urlChanged.connect(self.update_urlbar)

        # adding action when loading is finished
        self.browser.loadFinished.connect(self.update_title)

        # set this browser as central widget or main window
        self.setCentralWidget(self.browser)

        # creating a status bar object
        self.status = QStatusBar()

        # adding status bar to the main window
        self.setStatusBar(self.status)

        # creating QToolBar for navigation
        navtb = QToolBar("Navigation")

        # adding this tool bar tot he main window
        self.addToolBar(navtb)

        # adding actions to the tool bar
        # creating a action for back
        back_btn = QAction("Back", self)

        # setting status tip
        back_btn.setStatusTip("Back to previous page")

        # adding action to the back button
        # making browser go back
        back_btn.triggered.connect(self.browser.back)

        # adding this action to tool bar
        navtb.addAction(back_btn)

        # similarly for forward action
        next_btn = QAction("Forward", self)
        next_btn.setStatusTip("Forward to next page")

        # adding action to the next button
        # making browser go forward
        next_btn.triggered.connect(self.browser.forward)
        navtb.addAction(next_btn)

        # similarly for reload action
        reload_btn = QAction("Reload", self)
        reload_btn.setStatusTip("Reload page")

        # adding action to the reload button
        # making browser to reload
        reload_btn.triggered.connect(self.browser.reload)
        navtb.addAction(reload_btn)

        # similarly for home action
        home_btn = QAction("Home", self)
        home_btn.setStatusTip("Go home")
        home_btn.triggered.connect(self.navigate_home)
        navtb.addAction(home_btn)

        # adding a separator in the tool bar
        navtb.addSeparator()

        # creating a line edit for the url
        self.urlbar = QLineEdit()

        # adding action when return key is pressed
        self.urlbar.returnPressed.connect(self.navigate_to_url)

        # adding this to the tool bar
        navtb.addWidget(self.urlbar)

        # adding stop action to the tool bar
        stop_btn = QAction("Stop", self)
        stop_btn.setStatusTip("Stop loading current page")

        # adding action to the stop button
        # making browser to stop
        stop_btn.triggered.connect(self.browser.stop)
        navtb.addAction(stop_btn)

        # showing all the components
        self.show()


    # method for updating the title of the window
    def update_title(self):
        title = self.browser.page().title()
        self.setWindowTitle("% s - Geek Browser" % title)


    # method called by the home action
    def navigate_home(self):

        # open the google
        self.browser.setUrl(QUrl("http://www.google.com"))

    # method called by the line edit when return key is pressed
    def navigate_to_url(self):

        # getting url and converting it to QUrl object
        q = QUrl(self.urlbar.text())

        # if url is scheme is blank
        if q.scheme() == "":
            # set url scheme to html
            q.setScheme("http")

        # set the url to the browser
        self.browser.setUrl(q)

    # method for updating url
    # this method is called by the QWebEngineView object
    def update_urlbar(self, q):

        # setting text to the url bar
        self.urlbar.setText(q.toString())

        # setting cursor position of the url bar
        self.urlbar.setCursorPosition(0)


# creating a pyQt5 application
app = QApplication(sys.argv)

# setting name to the application
app.setApplicationName("Geek Browser")

# creating a main window object
window = MainWindow()

# loop
app.exec_()

i basically cloned the geeksforgeeks simple browser (https://www.geeksforgeeks.org/creating-a-simple-browser-using-pyqt5/) and made changes to it so this also behaves the same also i think microsoft made some changes to site as it worked fine yesterday.

can someone help me solve this i wanted to get url of app from the site.


Solution

  • Well I found the answer to my issue, the answer was just to upgrade to the latest pyqt6(https://pypi.org/project/PyQt6/) and use pyqt6-webengine(https://pypi.org/project/PyQt6-WebEngine/), the pyqt5-webengine was implemented using chroimium 87 and the pyqt6-webengine was implemented using chromium 90 (https://wiki.qt.io/QtWebEngine/ChromiumVersions) which automatically upgrades http requests to https.

    in pyqt5 i got this error

    js: Mixed Content: The page at 'https://www.microsoft.com/en-in' was loaded over HTTPS, but requested an insecure image 'http://arc.msn.com/v3/Delivery/Events/Impression?PID=425107905&TID=700346678&CID=128000000003037669&BID=1794732536&PG=PC000P0FR5.0000000IQX&TPID=425107905&ASID=001880bd94094f85a068a36faf64dcc8&BCNT=1&PG=PC000P0FR5.0000000IQX&UNID=318922&MAP_TID=14964BA1-C3BA-47F4-9E0C-84F0E8F87A52&ASID=FD46F1A327D7474EBFE5E7A37D3D2ABC&REQASID=FD46F1A327D7474EBFE5E7A37D3D2ABC&ARC=1&EMS=1&LOCALE=EN-IN&COUNTRY=IN&HTD=-1&LANG=16393&DEVLANG=EN&CIP=52.230.41.54&ID=3E20CD16E70260B91F34DC64E6B06116&OPTOUTSTATE=0&MARKETBASEDCOUNTRY=IN&CFMT=&SFT=GIF%2CAGIF%2CJPEG%2CJPG%2CBMP%2CPNG&H=320&W=240&FESVER=1.3&DEVFAM=WINDOWS.DESKTOP&ARCH=X86&APIVER=7000&AS=T&AS1=T&AS2=T&CHNL=CFD&UIT=G'. This content should also be served over HTTPS.
    process is terminated with return code 3221225477.

    Which i am gussing means it was unable to process the request as it came as an http request and the site ran https so due to this the app crashed since pyqt5-webengine (old version of chromium) didn't upgrade http request to https automatically.

    after upgrading to pyqt6

    js: Mixed Content: The page at 'https://www.microsoft.com/en-in/' was loaded over HTTPS, but requested an insecure element 'http://arc.msn.com/v3/Delivery/Events/Impression?PID=425107905&TID=700346678&CID=128000000003037669&BID=1368990958&PG=PC000P0FR5.0000000IQX&TPID=425107905&ASID=595dbd04fa15459fa34c9c2e09767c7f&BCNT=1&PG=PC000P0FR5.0000000IQX&UNID=318922&MAP_TID=5E7FABA2-C730-4EE2-8234-FF66A1A9BB9D&ASID=30465AA3C164432A80ECBC230628569F&REQASID=30465AA3C164432A80ECBC230628569F&ARC=1&EMS=1&LOCALE=EN-IN&COUNTRY=IN&HTD=-1&LANG=16393&DEVLANG=EN&CIP=52.230.41.54&ID=064BAED440726CB73AFABF7541856DF7&OPTOUTSTATE=0&MARKETBASEDCOUNTRY=IN&CFMT=&SFT=GIF%2CAGIF%2CJPEG%2CJPG%2CBMP%2CPNG&H=320&W=240&FESVER=1.3&DEVFAM=WINDOWS.DESKTOP&ARCH=X86&APIVER=7000&AS=T&AS1=T&AS2=T&CHNL=CFD&UIT=G'. This request was automatically upgraded to HTTPS, For more information see https://blog.chromium.org/2019/10/no-more-mixed-messages-about-https.html

    so after i changed to pyqt6 the same error came but instead of crashing and giving me the error code it automatically upgraded the request to https (since it uses more recent version of chromium). i think if you are somehow able to make pyqt5 use latest version of chromium it should work but i dont know if its possible or how to do.

    Feel free to correct me if i am wrong. I am not an expert in python or pyqt but this solution of upgrading to pyqt6 worked for me and solved my issue.

    Loading The Page