Files
Taremin-webui-monaco-prompt/tests/e2e/multitext/test_multitext_resize_tracking.py
Taremin 26e910b4f1 chore(test): ComfyUIの複数バージョン自動検証基盤の導入とテスト安定化
テスト時に指定された複数のComfyUIバージョンを自動ダウンロードし、最適な仮想環境を構築した上でテストを実行する仕組みを導入。また、Playwright同期APIに起因するデッドロックやキャッシュ汚染によるテストのハングアップ問題を解消。

- 設定ファイルで複数バージョンの定義をサポート
- 該当するComfyUIおよびEmbeddable Pythonを自動取得するdownloaderモジュールを追加
- pytest_generate_testsによりバージョン別のテストを動的にパラメータ化
- min_comfy_versionマーカーによるバージョン制限テストの条件付きスキップをサポート
- Windows環境でのゾンビプロセス防止のためtaskkillによる強制終了処理を追加
- バージョン切り替え時のブラウザキャッシュ汚染を防ぐためキャッシュを無効化
- Playwright同期APIのダイアログ処理をJavaScript側でのモック化へ移行しデッドロックを回避
- 設定画面でのCSVトグル描画有無によるテストアプローチの動的切り替えを実装
- リサイズ操作のsteps指定など各種タイミング競合とタイムアウト処理を強化
2026-07-13 21:13:11 +09:00

98 lines
4.1 KiB
Python

import pytest
import os
import json
from playwright.sync_api import Page, expect
def test_multitext_resize_tracking(page: Page, comfyui_server, wait_for_comfyui, wmp_helpers):
"""リサイズバーがマウスカーソルに追従するか(特にズーム時)を検証する"""
page.set_viewport_size({"width": 1920, "height": 1080})
screenshot_dir = os.path.join(os.getcwd(), "tests", "screenshots_resize_tracking")
os.makedirs(screenshot_dir, exist_ok=True)
page.on("console", lambda msg: print(f"BROWSER: {msg.text}"))
page.goto(comfyui_server)
wait_for_comfyui(page)
# ワークフローをクリア
page.evaluate("() => { if (typeof app !== 'undefined' && app.graph) { app.graph.clear(); } }")
wmp_helpers.wait_for_graph_clear(page)
# MultiTextノードを作成
node_type = page.evaluate("""() => {
const types = Object.keys(window.LiteGraph.registered_node_types);
return types.find(t => t.includes('WebuiMonacoPromptMultiText'));
}""")
assert node_type, "MultiText node type should be registered"
import uuid
unique_id = uuid.uuid4().hex[:6]
page.evaluate(f"""() => {{
const app = window.app || window.ComfyApp;
const node = window.LiteGraph.createNode("{node_type}");
node.title = "MT-RESIZE-TRACKING-{unique_id}";
node.pos = [100, 100];
node.size = [800, 600];
app.graph.add(node);
}}""")
wmp_helpers.wait_for_editor(page)
# リサイザーの位置を検証する関数
def perform_resize_and_check(drag_distance_x, scale=1.0):
print(f"\\n--- Testing resize tracking at scale: {scale} ---")
# スケール設定
page.evaluate(f"window.app.canvas.ds.scale = {scale}; window.app.canvas.setDirty(true, true);")
wmp_helpers.wait_for_ui_stabilize(page, 500)
resizer = page.locator("[class*='multitext-resizer']")
initial_box = resizer.bounding_box()
assert initial_box, "Resizer bounding box not found"
start_x = initial_box["x"] + initial_box["width"] / 2
start_y = initial_box["y"] + initial_box["height"] / 2
target_x = start_x + drag_distance_x
# ドラッグの開始
page.mouse.move(start_x, start_y)
page.mouse.down()
# ドラッグ中
page.mouse.move(target_x, start_y, steps=10)
wmp_helpers.wait_for_ui_stabilize(page, 500) # リサイズ処理が反映されるのを待つ
# ドラッグ中のリサイザーの位置を取得
current_box = resizer.bounding_box()
current_resizer_center_x = current_box["x"] + current_box["width"] / 2
print(f"DEBUG (Scale {scale}) - Target Mouse X: {target_x}, Resizer Center X: {current_resizer_center_x}")
# ドラッグ終了
page.mouse.up()
wmp_helpers.wait_for_ui_stabilize(page, 500)
try:
debug_logs = page.evaluate("window.RESIZE_DEBUG")
print(f"BROWSER RESIZE LOGS: {json.dumps(debug_logs, indent=2)}")
except Exception as e:
print(f"Failed to get RESIZE_DEBUG: {e}")
page.evaluate("window.RESIZE_DEBUG = []")
# マウスカーソル(target_x)とリサイザーの中心(current_resizer_center_x)が近いことを確認
# 30px以内の誤差は許容(UIの描画遅延や端数処理などを考慮)
assert abs(target_x - current_resizer_center_x) < 30, \
f"Resizer did not track mouse closely. Scale: {scale}, Expected Mouse X: {target_x}, Actual Resizer X: {current_resizer_center_x}, Diff: {abs(target_x - current_resizer_center_x)}"
# スケール 1.0 で検証
perform_resize_and_check(150, scale=1.0)
page.screenshot(path=os.path.join(screenshot_dir, "01_scale_1.png"))
# スケール 0.6 で検証 (ズームアウト、hideOnZoomを考慮)
perform_resize_and_check(100, scale=0.6)
page.screenshot(path=os.path.join(screenshot_dir, "02_scale_0_6.png"))
# スケール 1.5 で検証 (ズームイン)
perform_resize_and_check(-100, scale=1.5)
page.screenshot(path=os.path.join(screenshot_dir, "03_scale_1_5.png"))