diff --git a/apps/terminal/applets/chrome/ChangeLog b/apps/terminal/applets/chrome/ChangeLog index 7a03e6949..81529958b 100644 --- a/apps/terminal/applets/chrome/ChangeLog +++ b/apps/terminal/applets/chrome/ChangeLog @@ -1,3 +1,11 @@ +# 2023-07-28 Version 0.7 +## 功能优化 + - 增加进度窗口,隐藏代填操作 + +# 2023-07-13 Version 0.6 +## 功能优化 + - 优化 Chrome 插件拦截逻辑 + # 2023-07-06 Version 0.5 ## 功能更新 - 增加匿名用户的支持,如果账号是匿名用户,username 和 secret 则为空 diff --git a/apps/terminal/applets/chrome/app.py b/apps/terminal/applets/chrome/app.py index 47cce8844..b19e219d1 100644 --- a/apps/terminal/applets/chrome/app.py +++ b/apps/terminal/applets/chrome/app.py @@ -9,7 +9,7 @@ from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.remote.webelement import WebElement -from code_dialog import CodeDialog +from code_dialog import CodeDialog, wrapper_progress_bar from common import (Asset, User, Account, Platform, Step) from common import (BaseApplication) from common import (notify_err_message, block_input, unblock_input) @@ -249,6 +249,7 @@ class AppletApplication(BaseApplication): self._chrome_options.add_argument("--app={}".format(self.asset.address)) self._chrome_options.add_argument("--user-data-dir={}".format(self._tmp_user_dir.name)) + @wrapper_progress_bar def run(self): service = Service() # driver 的 console 终端框不显示 @@ -256,11 +257,11 @@ class AppletApplication(BaseApplication): self.driver = webdriver.Chrome(options=self._chrome_options, service=service) self.driver.implicitly_wait(10) if self.app.asset.address != "": + self.driver.minimize_window() ok = self.app.execute(self.driver) if not ok: print("执行失败") self.driver.maximize_window() - def wait(self): disconnected_msg = "Unable to evaluate script: disconnected: not connected to DevTools\n" closed_msg = "Unable to evaluate script: no such window: target window already closed" diff --git a/apps/terminal/applets/chrome/code_dialog.py b/apps/terminal/applets/chrome/code_dialog.py index b3b93730c..862e80986 100644 --- a/apps/terminal/applets/chrome/code_dialog.py +++ b/apps/terminal/applets/chrome/code_dialog.py @@ -1,3 +1,5 @@ +import functools +import threading import tkinter as tk from tkinter import StringVar, messagebox from tkinter import ttk @@ -13,7 +15,7 @@ class CodeDialog(object): mainframe.grid(column=0, row=0, ) self.label = ttk.Label(mainframe, text=label, width=10) self.input = ttk.Entry(mainframe, textvariable=self.code, width=20) - self.button = ttk.Button(mainframe, text="ok", command=self.click_ok, width=5,) + self.button = ttk.Button(mainframe, text="ok", command=self.click_ok, width=5, ) self.label.grid(row=1, column=0) self.input.grid(row=1, column=1) self.button.grid(row=2, column=1, sticky=tk.E) @@ -32,6 +34,63 @@ class CodeDialog(object): self.root.destroy() +class TkProgressBar(object): + def __init__(self, wait_func=None): + self._wait_func = wait_func + self._done = threading.Event() + self._root = None + + def _check(self): + if self._done.isSet(): + self._root.destroy() + return + self._root.after(100, self._check) + + def stop(self): + self._done.set() + + def show(self): + if not self._wait_func: + return + root = tk.Tk() + width, height = root.winfo_screenwidth(), root.winfo_screenheight() + root.geometry('%dx%d' % (width, height)) + root.title('Progress') + root.grid() + pb_length = width - 20 + pb = ttk.Progressbar(root, orient='horizontal', length=pb_length, mode='indeterminate') + pb.pack(expand=True, padx=10, pady=10) + + self._root = root + self._root.after(60, pb.start) + self._root.after(100, self._check) + + def _wait_run_func(): + self._wait_func() + self.stop() + print('wait func done') + + self._root.attributes("-topmost", True) + self._root.attributes("-fullscreen", True) + threading.Thread(target=_wait_run_func).start() + self._root.mainloop() + + +# progress bar 装饰器,用于显示进度动画 +# 此方法会创建一个全屏的进度条窗口 +def wrapper_progress_bar(func): + def inner(*args, **kwargs): + wait_func = functools.partial(func, *args, **kwargs) + tk_process = TkProgressBar(wait_func=wait_func) + tk_process.show() + + return inner + + if __name__ == '__main__': - code = CodeDialog(title="Code Dialog", label="Code: ").wait_string() - print(code) + # code = CodeDialog(title="Code Dialog", label="Code: ").wait_string() + # print(code) + import time + progress = TkProgressBar(wait_func=lambda: time.sleep(15)) + progress.show() + print('end') diff --git a/apps/terminal/applets/chrome/manifest.yml b/apps/terminal/applets/chrome/manifest.yml index 066530eef..c740b23a6 100644 --- a/apps/terminal/applets/chrome/manifest.yml +++ b/apps/terminal/applets/chrome/manifest.yml @@ -1,6 +1,6 @@ name: chrome display_name: "{{ 'Chrome Browser' | trans }}" -version: 0.6 +version: 0.7 comment: "{{ 'Chrome Browser Open URL Page Address' | trans }}" author: JumpServer Team exec_type: python