browser_control.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. from __future__ import annotations
  2. import time
  3. from typing import Any
  4. from ... import windows_automation
  5. from ..context import WorkflowContext
  6. from ..registry import control_ports, field_def, register_node
  7. def _number(value: Any, default: float = 0) -> float:
  8. try:
  9. return float(value)
  10. except (TypeError, ValueError):
  11. return default
  12. def _boolean(value: Any, default: bool = False) -> bool:
  13. if value in (None, ""):
  14. return default
  15. if isinstance(value, str):
  16. return value.strip().lower() in {"1", "true", "yes", "y", "on"}
  17. return bool(value)
  18. def ensure_browser_node(node: dict[str, Any], inputs: dict[str, Any], context: WorkflowContext) -> dict[str, Any]:
  19. params = node.get("params", {})
  20. browser = str(inputs.get("browser", params.get("browser")) or "edge")
  21. url = str(inputs.get("url", params.get("url")) or "").strip()
  22. maximize = _boolean(inputs.get("maximize", params.get("maximize")), True)
  23. wait_seconds = max(0, min(_number(inputs.get("wait_seconds", params.get("wait_seconds")), 2), 30))
  24. if url:
  25. opened = windows_automation.open_url(url=url, browser=browser, new_window=bool(params.get("new_window", True)))
  26. elif browser.lower() in {"edge", "msedge"}:
  27. opened = windows_automation.start_program("cmd.exe /c start msedge", shell=True)
  28. else:
  29. opened = windows_automation.start_program("cmd.exe /c start chrome", shell=True)
  30. context.remember_pid(opened.get("pid"))
  31. if wait_seconds:
  32. time.sleep(wait_seconds)
  33. if maximize:
  34. windows_automation.keyboard_action("hotkey", keys=["win", "up"])
  35. return {"action": "ensure_browser", "browser": browser, "url": url, "opened": opened, "maximized": maximize}
  36. def browser_key_node(node: dict[str, Any], inputs: dict[str, Any], context: WorkflowContext) -> dict[str, Any]:
  37. params = node.get("params", {})
  38. action = str(inputs.get("action", params.get("action")) or "fullscreen")
  39. if action == "fullscreen":
  40. result = windows_automation.keyboard_action("press", key="f11")
  41. elif action == "back":
  42. result = windows_automation.keyboard_action("hotkey", keys=["alt", "left"])
  43. elif action == "forward":
  44. result = windows_automation.keyboard_action("hotkey", keys=["alt", "right"])
  45. elif action == "refresh":
  46. result = windows_automation.keyboard_action("press", key="f5")
  47. elif action == "escape":
  48. result = windows_automation.keyboard_action("press", key="escape")
  49. elif action == "close_tab":
  50. result = windows_automation.keyboard_action("hotkey", keys=["ctrl", "w"])
  51. elif action == "close_window":
  52. result = windows_automation.keyboard_action("hotkey", keys=["alt", "f4"])
  53. else:
  54. result = {"action": "browser_noop", "key": None}
  55. return {"action": action, "keyboard": result}
  56. register_node(
  57. {
  58. "type": "browser.ensure_foreground",
  59. "category": "browser",
  60. "label": "确保浏览器前台",
  61. "description": "打开或唤起浏览器,可选打开指定网址,并尝试最大化窗口。",
  62. "params": {
  63. "url": field_def("text", "网址", "", description="为空时仅尝试启动浏览器。"),
  64. "browser": field_def("select", "浏览器", "edge", options=["default", "edge"]),
  65. "new_window": field_def("boolean", "新窗口", True),
  66. "maximize": field_def("boolean", "最大化", True),
  67. "wait_seconds": field_def("number", "等待秒数", 2, minimum=0, maximum=30),
  68. },
  69. "inputs": {
  70. "url": field_def("string", "网址"),
  71. "browser": field_def("string", "浏览器"),
  72. "maximize": field_def("boolean", "最大化"),
  73. "wait_seconds": field_def("number", "等待秒数"),
  74. },
  75. "outputs": {
  76. "action": {"type": "string", "label": "动作"},
  77. "browser": {"type": "string", "label": "浏览器"},
  78. "url": {"type": "string", "label": "网址"},
  79. "opened": {"type": "object", "label": "启动结果"},
  80. "maximized": {"type": "boolean", "label": "是否最大化"},
  81. },
  82. "control_ports": control_ports(),
  83. },
  84. ensure_browser_node,
  85. )
  86. register_node(
  87. {
  88. "type": "browser.control",
  89. "category": "browser",
  90. "label": "浏览器快捷控制",
  91. "description": "对当前浏览器窗口执行全屏、返回、刷新、关闭标签页等快捷操作。",
  92. "params": {
  93. "action": field_def(
  94. "select",
  95. "动作",
  96. "fullscreen",
  97. options=["fullscreen", "back", "forward", "refresh", "escape", "close_tab", "close_window"],
  98. ),
  99. },
  100. "inputs": {"action": field_def("string", "动作")},
  101. "outputs": {
  102. "action": {"type": "string", "label": "动作"},
  103. "keyboard": {"type": "object", "label": "键盘结果"},
  104. },
  105. "control_ports": control_ports(),
  106. },
  107. browser_key_node,
  108. )