Qwebengine security pop not showing

106 Views Asked by At

I build one normal browser with pyqt5 and qwebengine. Everything working fine but the security pop is not showing...

For example, if we go to this site:

http://jexmon.co.in/login/register

It is asking for a username and password pop-up in Chrome.

But in my application, it is redirecting to the error page.

I have enabled the javascript on that web view but no luck

# 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

# main window

class MainWindow(QMainWindow):

    # constructor

    def __init__(self, *args, **kwargs):

        super(MainWindow, self).__init__(*args, **kwargs)

        # creating a tab widget

        self.tabs = QTabWidget()

        # making document mode true

        self.tabs.setDocumentMode(True)

        # adding action when double clicked

        self.tabs.tabBarDoubleClicked.connect(self.tab_open_doubleclick)

        # adding action when tab is changed

        self.tabs.currentChanged.connect(self.current_tab_changed)

        # making tabs closeable

        self.tabs.setTabsClosable(True)

        # adding action when tab close is requested

        self.tabs.tabCloseRequested.connect(self.close_current_tab)

        # making tabs as central widget

        self.setCentralWidget(self.tabs)

        # creating a status bar

        self.status = QStatusBar()

        # setting status bar to the main window

        self.setStatusBar(self.status)

        # creating a tool bar for navigation

        navtb = QToolBar("Navigation")

        # adding tool bar tot he main window

        self.addToolBar(navtb)

        # creating back action

        back_btn = QAction("Back", self)

        # setting status tip

        back_btn.setStatusTip("Back to previous page")

        # adding action to back button

        # making current tab to go back

        back_btn.triggered.connect(lambda: self.tabs.currentWidget().back())

        # adding this to the navigation tool bar

        navtb.addAction(back_btn)

        # similarly adding next button

        next_btn = QAction("Forward", self)

        next_btn.setStatusTip("Forward to next page")

        next_btn.triggered.connect(lambda: self.tabs.currentWidget().forward())

        navtb.addAction(next_btn)

        # similarly adding reload button

        reload_btn = QAction("Reload", self)

        reload_btn.setStatusTip("Reload page")

        reload_btn.triggered.connect(lambda: self.tabs.currentWidget().reload())

        navtb.addAction(reload_btn)

        # creating home action

        home_btn = QAction("Home", self)

        home_btn.setStatusTip("Go home")

        # adding action to home button

        home_btn.triggered.connect(self.navigate_home)

        navtb.addAction(home_btn)

        # adding a separator

        navtb.addSeparator()

        # creating a line edit widget for URL

        self.urlbar = QLineEdit()

        # adding action to line edit when return key is pressed

        self.urlbar.returnPressed.connect(self.navigate_to_url)

        # adding line edit to tool bar

        navtb.addWidget(self.urlbar)

        # similarly adding stop action

        stop_btn = QAction("Stop", self)

        stop_btn.setStatusTip("Stop loading current page")

        stop_btn.triggered.connect(lambda: self.tabs.currentWidget().stop())

        navtb.addAction(stop_btn)

        # creating first tab

        self.add_new_tab(QUrl('http://www.google.com'), 'Homepage')

        # showing all the components

        self.show()

        # setting window title

        self.setWindowTitle("Geek PyQt5")

    # method for adding new tab

    def add_new_tab(self, qurl = None, label ="Blank"):

        # if url is blank

        if qurl is None:

            # creating a google url

            qurl = QUrl('http://www.google.com')

        # creating a QWebEngineView object

        browser = QWebEngineView()

        # setting url to browser

        browser.setUrl(qurl)

        # setting tab index

        i = self.tabs.addTab(browser, label)

        self.tabs.setCurrentIndex(i)

        # adding action to the browser when url is changed

        # update the url

        browser.urlChanged.connect(lambda qurl, browser = browser:

                                self.update_urlbar(qurl, browser))

        # adding action to the browser when loading is finished

        # set the tab title

        browser.loadFinished.connect(lambda _, i = i, browser = browser:

                                    self.tabs.setTabText(i, browser.page().title()))

    # when double clicked is pressed on tabs

    def tab_open_doubleclick(self, i):

        # checking index i.e

        # No tab under the click

        if i == -1:

            # creating a new tab

            self.add_new_tab()

    # when tab is changed

    def current_tab_changed(self, i):

        # get the curl

        qurl = self.tabs.currentWidget().url()

        # update the url

        self.update_urlbar(qurl, self.tabs.currentWidget())

        # update the title

        self.update_title(self.tabs.currentWidget())

    # when tab is closed

    def close_current_tab(self, i):

        # if there is only one tab

        if self.tabs.count() < 2:

            # do nothing

            return

        # else remove the tab

        self.tabs.removeTab(i)

    # method for updating the title

    def update_title(self, browser):

        # if signal is not from the current tab

        if browser != self.tabs.currentWidget():

            # do nothing

            return

        # get the page title

        title = self.tabs.currentWidget().page().title()

        # set the window title

        self.setWindowTitle("% s - Geek PyQt5" % title)

    # action to go to home

    def navigate_home(self):

        # go to google

        self.tabs.currentWidget().setUrl(QUrl("http://www.google.com"))

    # method for navigate to url

    def navigate_to_url(self):

        # get the line edit text

        # convert it to QUrl object

        q = QUrl(self.urlbar.text())

        # if scheme is blank

        if q.scheme() == "":

            # set scheme

            q.setScheme("http")

        # set the url

        self.tabs.currentWidget().setUrl(q)

    # method to update the url

    def update_urlbar(self, q, browser = None):

        # If this signal is not from the current tab, ignore

        if browser != self.tabs.currentWidget():

            return

        # set text to the url bar

        self.urlbar.setText(q.toString())

        # set cursor position

        self.urlbar.setCursorPosition(0)

# creating a PyQt5 application

app = QApplication(sys.argv)

# setting name to the application

app.setApplicationName("Geek PyQt5")

# creating MainWindow object

window = MainWindow()

# loop

app.exec_()


1

There are 1 best solutions below

0
relent95 On

Use the QWebEnginePage::authenticationRequired signal, like the official example. But it's a little bit tricky in PyQt5 for canceling the authentication.

This is a simple example for that.

from PyQt5 import sip
from PyQt5.QtCore import *
from PyQt5.QtNetwork import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.resize(600, 400)

        web_view = QWebEngineView()
        self.setCentralWidget(web_view)

        web_view.load(QUrl('http://jexmon.co.in/login/register'))
        def on_auth(url, authenticator):
            cred, ok = QInputDialog.getText(self, 'Authentication', 'Credential')
            if ok:
                user, passwd = cred.split('/')
                authenticator.setUser(user)
                authenticator.setPassword(passwd)
            else:
                sip.assign(authenticator, QAuthenticator())
        web_view.page().authenticationRequired.connect(on_auth)

app = QApplication([])
main_wnd = MainWindow()
main_wnd.show()
app.exec()