python - 如何将 Selenium Firefox 浏览器嵌入到 PyQt4 框架中

标签 python python-2.7 selenium pyqt4

我希望这个问题不是太牵强。我很擅长 Selenium,最近一直在使用 PyQt4。我想将它们与我当前正在开发的程序一起使用,如果我可以将可控浏览器嵌入到 Qt4 框架或小部件中,它会更顺利地工作。这可以做到吗?如果是这样,怎么办?

它不必使用 Selenium 来完成,我只是希望能够控制浏览器或至少在 Qt 小部件或框架中显示网页。

最佳答案

因此,在研究了其他人使用的方法后,我找到了答案。 我使用的代码来 self 从here获得的“非常简单的浏览器”模块。

我修改了代码,以便更适合 future 的自己。 这是我修改后的代码版本:

from PyQt4 import QtCore, QtGui, QtWebKit

class Browser(QtGui.QMainWindow):

    def __init__(self, size=[800,600], frame=None, centralWidget=None, default_url='https://www.google.com', backButton=True, forwardButton=True, topBar=True):
        """
            Initialize the browser GUI and connect the events
        """

        self.showBackButton = backButton
        self.showForwardButton = forwardButton
        self.showTopBar = topBar

        QtGui.QMainWindow.__init__(self)
        self.resize(size[0],size[1])
        if (centralWidget == None):
            self.centralwidget = QtGui.QWidget(self)
        else:
            self.centralwidget = centralWidget

        self.mainLayout = QtGui.QHBoxLayout(self.centralwidget)
        self.mainLayout.setSpacing(0)
        self.mainLayout.setMargin(1)

        if (frame == None):
            self.frame = QtGui.QFrame(self.centralwidget)
        else:
            self.frame = frame

        self.gridLayout = QtGui.QVBoxLayout(self.frame)
        self.gridLayout.setMargin(0)
        self.gridLayout.setSpacing(0)

        self.horizontalLayout = QtGui.QHBoxLayout()
        if (self.showTopBar):
            self.tb_url = QtGui.QLineEdit(self.frame)
        if (self.showBackButton):
            self.bt_back = QtGui.QPushButton(self.frame)
        if (self.showForwardButton):
            self.bt_ahead = QtGui.QPushButton(self.frame)

        if (self.showBackButton):
            self.bt_back.setIcon(QtGui.QIcon().fromTheme("go-previous"))
        if (self.showForwardButton):
            self.bt_ahead.setIcon(QtGui.QIcon().fromTheme("go-next"))

        if (self.showBackButton):
            self.horizontalLayout.addWidget(self.bt_back)
        if (self.showForwardButton):
            self.horizontalLayout.addWidget(self.bt_ahead)
        if (self.showTopBar):
            self.horizontalLayout.addWidget(self.tb_url)
        self.gridLayout.addLayout(self.horizontalLayout)

        self.html = QtWebKit.QWebView()
        self.gridLayout.addWidget(self.html)
        self.mainLayout.addWidget(self.frame)
        #self.setCentralWidget(self.centralwidget)  ---  Not needed when embedding into a frame

        if (self.showTopBar):
            self.connect(self.tb_url, QtCore.SIGNAL("returnPressed()"), self.browse)
        if (self.showBackButton):
            self.connect(self.bt_back, QtCore.SIGNAL("clicked()"), self.html.back)
        if (self.showForwardButton):
            self.connect(self.bt_ahead, QtCore.SIGNAL("clicked()"), self.html.forward)
        self.connect(self.html, QtCore.SIGNAL("urlChanged(const QUrl)"), self.url_changed)

        self.default_url = default_url
        if (self.showTopBar):
            self.tb_url.setText(self.default_url)
        self.open(self.default_url)

    def browse(self):
        """
            Make a web browse on a specific url and show the page on the
            Webview widget.
        """

        if (self.showTopBar):
            url = self.tb_url.text() if self.tb_url.text() else self.default_url
            self.html.load(QtCore.QUrl(url))
            self.html.show()
        else:
            pass

    def url_changed(self, url):
        """
            Triggered when the url is changed
        """
        if (self.showTopBar):
            self.tb_url.setText(url.toString())
        else:
            pass

    def open(self, url):
        self.html.load(QtCore.QUrl(url))
        self.html.show()

目前它可能需要一些工作,但我已经对其进行了测试,它正在做我需要它做的事情。我使用以下在执行脚本时运行的代码块对其进行了测试

if (__name__ == "__main__"):
    app = QtGui.QApplication(sys.argv)
    window = QtGui.QMainWindow()
    window.resize(800,600)
    myFrame = QtGui.QFrame(window)
    myFrame.resize(200,200)
    myFrame.move(10,10)

    main = Browser(centralWidget=myFrame, default_url='https://www.google.com/', forwardButton=False, backButton=False, topBar=False)

    window.show()
    sys.exit(app.exec_())

就像我说的,它可能需要工作,但它确实做了我需要它做的事情。现在我可以将其嵌入到框架中(具有我选择的大小)以在另一个应用程序中使用。

关于我的修改:我可以保留/删除后退按钮、前进按钮和顶栏(用于 URL)。但网络浏览器仍然可以使用“打开”功能进行控制。

如果你想打开另一个网页,就像下面这样简单

main.open('https://your.webpage.here.com')

关于python - 如何将 Selenium Firefox 浏览器嵌入到 PyQt4 框架中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46250829/

相关文章:

python - 如何在 python 中将一个列表添加到另一个列表?

python - Azure ML 文件数据集 mount() 速度慢且下载数据两次

c++ - 初学者用 Python 扩展 C(特别是 Numpy)

python - 正则表达式\b 字边界不适用于 "!"

python - 在 flask 中开始 celery : AttributeError: 'Flask' object has no attribute 'user_options'

Winform 中的 Selenium Webdriver 和嵌入式浏览器 - 如何连接 web_driver 实例?

java - 使用 selenium 进行 Maven 范围测试

javascript - Selenium 是否集成 "independent"浏览器(通过网络驱动程序)或使用操作系统中安装的现有浏览器?

python - 为什么 pandas bool 过滤会产生 float ?

python - Odoo - 如何访问 Web Controller 上的记录集