【问题标题】:GUI is not responding after unittests are started单元测试启动后 GUI 没有响应
【发布时间】:2020-05-31 12:39:01
【问题描述】:

我已经编写了一些使用 Selenium 的单元测试并为其创建了 Tkinter GUI。

script.py 是:

from selenium import webdriver
import unittest

class LaunchChrome(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Chrome(r"C:\Users\USERNAME\PycharmProjects\First\Drivers\chromedriver.exe")
        cls.driver.maximize_window()
        cls.driver.get('https://facebook.com')

if __name__ == '__main__':
    unittest.main()

interface.py 是:

from tkinter import Button
from tkinter.ttk import *
import unittest
from ex import LaunchChrome

class HomeApplication:

    def init_page(self):

        self.buStart = Button(self, text="Start", width=60)
        self.buStart.grid(row=4, column=0, columnspan=3)
        self.buStart.config(command=self.start_app)
    def run(self):
        Launch_Chrome = unittest.TestLoader().loadTestsFromTestCase(LaunchChrome)
        test_suite = unittest.TestSuite([Launch_Chrome])
        unittest.TextTestRunner(verbosity=2).run(test_suite)
    def start_app(self):
        print("run")
        self.run()

打开 GUI 并单击“开始”按钮后,单元测试工作正常,但 GUI 停止响应(无响应):

这段代码如何使用多处理?

【问题讨论】:

  • 当你运行 Selenium 脚本时,你会在脚本执行时暂停 Tkinter 主循环,因此,窗口没有响应。您是否尝试过使用线程?
  • 我在函数 start_app 中添加了这个代码 threading.Thread(target=self.run()) 但不是同样的问题
  • 什么是最好的线程或多处理,我看到Python doc建议使用多处理
  • 如果threading.Thread(target=self.run())改为threading.Thread(target=self.run),脚本不启动
  • 我添加了同样的问题兄弟

标签: python python-3.x user-interface tkinter


【解决方案1】:

您需要创建一个线程来在那里运行测试。但是有必要.start()它。将 interface.py 文件替换为:

import tkinter as tk
import tkinter.ttk as ttk
import unittest
from threading import Thread

from ex import LaunchChrome


class HomeApplication(tk.Tk):
    def __init__(self):
        super().__init__()

        ttk.Button(self, text="Start", width=60, command=self.start_app)\
                     .grid(row=4, column=0, columnspan=3)

    def run_tests(self):
        test_suite = unittest.TestSuite([unittest.TestLoader()\
                                         .loadTestsFromTestCase(LaunchChrome)])
        unittest.TextTestRunner(verbosity=2).run(test_suite)

    def start_app(self):
        Thread(target=self.run_tests, daemon=True).start()

if __name__ == "__main__":
    HomeApplication().mainloop()

【讨论】:

  • 谢谢,但是什么是 daemon=True,我添加 Thread(target=self.run_tests).start() without daemon=True 并且工作正常
  • @john 如果 daemon=True 指定,附加线程与主线程一起停止。尽管在这种情况下它并没有多大用处,因为即使 Python 进程将停止(不仅是线程),浏览器和 Chrome 驱动程序也不会关闭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多