Python PyQt5 webview не может открывать вкладки, созданные без URL - PullRequest
0 голосов

Попытка анализа веб-сайта с помощью pyqt5.Моя проблема в том, что созданная этой страницей вкладка - это не ссылка, а кнопка, создающая вкладку с функцией onclick, поэтому при использовании сигнала linkClicked ничего не происходит. я хочу проанализировать вкладку.

Все примеры, которые я нахожу в Интернете, открывают вкладки со ссылками, так что я не могу это понять.

PS Я знаю, что Qwebkit основан на предикате, но я должен использовать это, чтобы windows xp совместимый.

Что у меня есть:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtWebKitWidgets import QWebView , QWebPage
from PyQt5 import QtWebKit
from PyQt5.QtWebKit import QWebSettings
from PyQt5.QtNetwork import *
import sys




class MainForm(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        self.tabWidget = QtWidgets.QTabWidget(self)        
        self.setCentralWidget(self.tabWidget)        
        self.loadUrl(QtCore.QUrl('https://www.notams.faa.gov/dinsQueryWeb/'))

    def loadUrl(self, url):    
        self.view = QWebView()  
        self.view.loadFinished.connect(self._on_load_finished)
        self.view.linkClicked.connect(self.on_linkClicked)
        self.view.loadStarted.connect(self.on_url_changed)
        self.view.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
        self.tabWidget.setCurrentIndex(self.tabWidget.addTab(self.view, 'loading...'))
        self.view.load(url)

    def _on_load_finished(self, ok):
        index = self.tabWidget.indexOf(self.sender())
        self.tabWidget.setTabText(index, self.sender().url().host())
        self.view.page().mainFrame().evaluateJavaScript("document.getElementsByTagName('button')[0].click();")
        self.view.page().mainFrame().evaluateJavaScript("document.getElementsByName('retrieveLocId')[0].value='%s';"%('lgel lgal lggg'))
        self.view.page().mainFrame().evaluateJavaScript("document.getElementsByName('submit')[0].click();")

    def on_linkClicked(self, url):        
        self.loadUrl(url)

    def on_url_changed(self):
        print('xdddd')



def main():
    app = QtWidgets.QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

enter image description here

1 Ответ

1 голос
/ 14 марта 2020

Когда страница запрашивает создание нового окна, вызывается createWindow(WebWindowType); если метод не возвращает новое представление QWeb [Engine] (или не реализовано по умолчанию), аналогичный метод вызывается для представления; опять же, если это не реализовано, ничего не происходит.

Если вы хотите загрузить новое окно в том же самом, что было запрошено, просто переопределите WebView и верните self и включите поддержку открытия нового windows из javascript:

class SelfishWebView(QWebView):
    def createWindow(self, windowType):
        return self


class MainForm(QtWidgets.QMainWindow):
    # ...
    def loadUrl(self, url):    
        self.view = SelfishWebView()  
        self.view.page().settings().setAttribute(
            QWebSettings.JavascriptCanOpenWindows, True)
        # ...

Обратите внимание, что если вы выполните javascript таким образом, он попытается рекурсивно вызвать снова, как только будет загружена новая страница (и, поскольку существует кнопка на этой новой странице, она будет пытаться нажать на нее); Вы должны отключить сигнал, как только он будет загружен в первый раз.

    def _on_load_finished(self, ok):
        self.view.loadFinished.disconnect(self._on_load_finished)
        # ...
...