当前位置: 首页 > 面试题库 >

当我与Selenuim一起使用时,PyQt QProgressBar无法正常工作

吴唯
2023-03-14
问题内容

我构建了一个PyQt5 GUI来进行一些selenium测试。除PyQt进度条外,其他所有操作均按预期进行。

在下面的第一个示例中,当我使用Selenium浏览器时,最后,当浏览器关闭时,进度条只会跳到100%。但是,selenium工作正常。

def test(self):
        self.completed = 0
        browser = webdriver.Firefox()
        links = ['http://www.somesite.com/', 'http://www.somesite.com/page2',
                 'http://www.somesite.com/page3']
        for link in links:
            browser.get(link)
            self.completed += 100 / len(links)
            time.sleep(2)
            print(link)
            self.progressBar.setValue(self.completed)
        browser.close()

但是,在下面的此版本中,在Selenium浏览器被注释掉的情况下,进度条可以按预期工作。

def test(self):
        self.completed = 0
        #browser = webdriver.Firefox()
        links = ['http://www.somesite.com/', 'http://www.somesite.com/page2',
                 'http://www.somesite.com/page3']
        for link in links:
            #browser.get(link)
            self.completed += 100 / len(links)
            time.sleep(2)
            print(link)
            self.progressBar.setValue(self.completed)
        #browser.close()

问题答案:

阻塞任务与在其中执行GUI的事件循环不友好,因为它们阻止了GUI执行的常规任务,例如票证检查,重画等。

在这些情况下,解决方案是使用线程执行阻止任务并使用信号发送信息。

import sys

from PyQt5 import QtCore, QtWidgets

from selenium import webdriver

class SeleniumWorker(QtCore.QObject):
    progressChanged = QtCore.pyqtSignal(int)
    def doWork(self):
        progress = 0
        browser = webdriver.Firefox()
        links = ['http://www.somesite.com/',
        'http://www.somesite.com/page2',
        'http://www.somesite.com/page3']
        for link in links:
            browser.get(link)
            progress += 100 / len(links)
            self.progressChanged.emit(progress)
        browser.close()

class Widget(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        QtWidgets.QWidget.__init__(self, *args, **kwargs)
        lay = QtWidgets.QHBoxLayout(self)
        progressBar = QtWidgets.QProgressBar()
        progressBar.setRange(0, 100)
        button = QtWidgets.QPushButton("Start")
        lay.addWidget(progressBar)
        lay.addWidget(button)
        self.thread = QtCore.QThread()
        self.worker = SeleniumWorker()
        self.worker.moveToThread(self.thread)
        self.thread.started.connect(self.worker.doWork)
        button.clicked.connect(self.thread.start)
        self.worker.progressChanged.connect(progressBar.setValue, QtCore.Qt.QueuedConnection)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())


 类似资料:
  • 我对scrollview和GeometryReader有一些问题。我想要一张图片下的物品清单。每个项目都应该有以下宽度和高度: 我为我的用例尝试了两种方法。这是我的第一个代码结构: 我正在使用几何体读取器来获取VStack的宽度,因为它有一个填充,我不想获得滚动视图的全宽。 但对于GeometryReader,UI上只显示ForEach循环中的最后一项。而GeometryReader只有很小的高度

  • 问题内容: 在我编写的flask应用程序中,我使用了一个外部库,该库可以使用环境变量进行配置。注意:我自己编写了这个外部库。因此,如有必要,我可以进行更改。从命令行运行时,运行带有以下内容的烧瓶服务器: 一切都如预期。但将它部署到Apache后,用它不工作了。事实上,打印出到(所以它在Apache日志中显示出来显示,该wsgi过程似乎是在一个非常不同的环境(一个,好像是这样了。其实,它指向我的发展

  • 一切工作正常,正如预期的那样,但是当我添加@Builder注释时: 在生成过程中,我得到以下错误: 这是龙目虫还是我做错了什么?

  • 我的片段包含一个viewpager,它包含一个listView 此listView行在左侧显示一个缩略图,在右侧显示一些文本。就像gmail应用一样,当我按下缩略图时,我希望它切换到ActionMode。按下其他位置时,将打开与按下的特定行相关的不同活动。这部分工作正常。 当不在actionMode中时,调用onItemClick,但一旦在actionMode中,就不再调用了... 在操作模式下,

  • 我有一个包含特殊字符的字符串列表 它像这样工作得很好 输出 安得拉邦 卡纳塔克邦 当我使用过滤器来做这件事时 它不起作用!我把名单原封不动地拿回来了。 我期待着这样一份清单['Andhra Pradesh','Karnataka'] 我希望从字符串列表中删除特殊字符,如,和

  • 我有一个带有Spring(5.7.2)Web/Security的REST API项目。 我只有一个表,它包含一个id和一个名称。 当我删除光盘时,我的DiscsService会 当我需要插入或更新时,我会: 我了解到,当您希望在同一事务中使用值(提交之前)时,将使用,并且将同步并清空SQL缓存。 在我的例子中,我看到我在数据库中插入/更新或删除了值。 我应该使用flush()(我认为不应该),但可