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

时间:2017-09-16 06:28:36

标签: python python-2.7 selenium pyqt4

我希望这个问题不是太牵强。我对Selenium很好,我最近一直在和PyQt4合作。我想将它们与我目前正在处理的程序一起使用,如果我可以将可控浏览器嵌入到Qt4框架或小部件中,它可以更顺利地运行。可以这样做吗?如果是这样,怎么样?

不必使用Selenium,我只想控制浏览器或至少在Qt小部件或框架中显示网页。

1 个答案:

答案 0 :(得分:1)

因此,在对其他人使用的方法进行一些研究后,我发现了它。 我使用的代码来自一个非常简单的浏览器"我从heredownload link

获得的模块

我修改了代码,以便为我未来的自我定制。 这是我修改后的代码版本:

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)。但是使用" open"可以控制webbrowser。功能

如果你想打开另一个网页,它就像下面的

一样简单
main.open('https://your.webpage.here.com')