You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5 QWebEngine浏览器身份验证安全弹窗未显示问题求助

解决PyQt5 QWebEngine身份验证弹窗不显示问题

你开发的浏览器无法弹出HTTP身份验证窗口,是因为QWebEngineView不会自动处理这类验证请求,必须手动监听并实现对应的弹窗逻辑。

具体修改方案:

在代码中添加对authenticationRequired信号的处理,当页面需要身份验证时,弹出对话框获取用户输入的账号密码,再提交验证信息。

修改后的完整代码:

# 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)
        # 绑定身份验证信号处理函数
        browser.page().authenticationRequired.connect(self.handle_authentication)
        # 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()))

    # 处理身份验证请求
    def handle_authentication(self, request, reply):
        # 弹出对话框获取用户名和密码
        username, ok1 = QInputDialog.getText(self, "身份验证", "请输入用户名:")
        if ok1:
            password, ok2 = QInputDialog.getText(self, "身份验证", "请输入密码:", QLineEdit.Password)
            if ok2:
                # 提交验证信息
                reply.submit(username, password)
            else:
                # 取消验证
                reply.reject()
        else:
            reply.reject()

    # 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. 在add_new_tab方法中,新增了browser.page().authenticationRequired.connect(self.handle_authentication),将身份验证信号绑定到自定义处理函数
  2. 添加了handle_authentication函数:
    • 使用QInputDialog分别弹出用户名和密码输入框,密码输入框会隐藏输入内容
    • 用户完成输入后,调用reply.submit(username, password)提交验证信息
    • 如果用户取消输入,调用reply.reject()拒绝验证请求

修改后,访问需要身份验证的页面时,浏览器会弹出输入框,用户输入账号密码后即可正常访问页面。

内容的提问来源于stack exchange,提问作者skinfo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:01:10